簡體   English   中英

如何刪除不存在的外鍵約束?

[英]How do I delete a foreign key constraint that doesn't exist?

在嘗試將我的PSA_Landing.tblSubsDetails SubmissionID字段(當前為PK)更改為“自動增量”字段的過程中,我每天遇到此問題,以便對不相關的內容進行一些快速測試。

嘗試運行時:

ALTER TABLE `PSA_Landing`.`tblSubsDetails` CHANGE COLUMN `SubmissionID`
`SubmissionID` INT(11) NOT NULL AUTO_INCREMENT ;

我得到錯誤:

ERROR 1833: Cannot change column 'SubmissionID': used in a foreign key 
constraint 'fk_StatusSubmissionId' of table 'PSA_Landing.tblSubsStatus'

問題是...我沒有表PSA_Landing.tblSubsStatus ...我不久前將其重命名為PSA_Landing.tblSubmissionStatus。 它還沒有FK。

當嘗試將tblSubmissionStatus BACK更改為tblSubsStatus時(只是為了查看是否有幫助),我收到錯誤1025:

 Apply changes to tblSubsStatus Error 1025: Error on rename of
'./PSA_Landing/tblSubmissionStatus' to './PSA_Landing/tblSubsStatus' (errno: 
150 - Foreign key constraint is incorrectly formed) SQL Statement: ALTER 
TABLE `PSA_Landing`.`tblSubmissionStatus`  RENAME TO `PSA_Landing`.`tblSubsStatus`

於是我跑了:

SHOW ENGINE innodb STATUS

並找到這個:

 ------------------------
LATEST FOREIGN KEY ERROR
------------------------
2016-01-24 03:15:32 7fc4410fb700 Error in foreign key constraint of table PSA_Landing/tblSubsStatus:
there is no index in the table which would contain
the columns as the first columns, or the data types in the
table do not match the ones in the referenced table
or one of the ON ... SET NULL columns is declared NOT NULL. Constraint:
,
CONSTRAINT "fk_StatusSubmissionId" FOREIGN KEY ("fk_SubmissionId") REFERENCES "tblSubsDetails" ("SubmissionID") ON DELETE NO ACTION ON UPDATE NO ACTION

最后,這使我嘗試:

alter table PSA_Landing.tblSubsStatus
drop foreign key fk_StatusSubmissionID

可以預期:

alter table PSA_Landing.tblSubsStatus  drop foreign key fk_StatusSubmissionID      
Error Code: 1146. Table 'PSA_Landing.tblSubsStatus' doesn't exist

出於絕望,我嘗試了以下方法:

alter table PSA_Landing.tblSubmissionStatus
drop foreign key fk_StatusSubmissionID

產生:

Error Code: 1091. Can't DROP 'fk_StatusSubmissionID'; check that column/key exists  

簡而言之...

當該表不存在時,如何從表PSA_Landing.tblSubsStatus中刪除約束fk_StatusSubmissionId?

SET @@FOREIGN_KEY_CHECKS = 0; 導致InnoDB禁用DML上的參照完整性檢查,並允許一些與外鍵相關的無效DDL操作,例如創建具有外鍵約束的表以引用尚不存在的表,或刪除由外鍵引用的表,同時仍然禁止明顯無效的請求,例如REFERENCES引用的數據類型不匹配的列或外鍵定義格式錯誤。

該語句在會話級別上運行,因此不會禁用整個服務器的外鍵約束實施。 它通常僅在從備份還原的過程中使用(該語句由mysqldump注入到轉儲文件中,並在重載操作期間定期執行),並且由於並非總是能夠解決外鍵中的循環依賴關系而在操作上是必需的(而mysqldump不會看不到需要-表以詞法順序轉儲)。

在這種情況下,解決方案是重新創建然后刪除幻影引用表,同時禁用FOREIGN_KEY_CHECKS

http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_foreign_key_checks

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM