由于表結構更改,使用新建表,現(xiàn)有部分表需要更改外鍵,將引用更改到新建表的相應字段。在更改過程中,部分表出現(xiàn)如下錯誤提示:
ALTER TABLE 語句與 COLUMN FOREIGN KEY 約束 '' 沖突。該沖突發(fā)生于數(shù)據庫 “***”,表 “***”, column “***”。
反復查看后,包括字段類型、長度等完全一致。不得其解,在網上找了下,發(fā)現(xiàn)有如下文章[1]提示:
根源: XXX表有數(shù)據
解決:刪掉XXX表的數(shù)據再執(zhí)行sql語句
恍然大悟,查看引用表數(shù)據與被引用表數(shù)據做比較,才發(fā)現(xiàn),原來是相應字段數(shù)據不一致的問題。即引用表中的相應字段數(shù)據,在被引用表中并不存在,無法建立實際上的外鍵關系,這是引用完整性的要求。早在讀書時就學到的東西,今天居然忘記了??磥?,知識只有在用了之后才屬于自己。
此外,在主次表引用設置后,也可能會出現(xiàn)正面的情況。即主表中的外鍵,在次表中已經失效,或不存在。
如表A:
aid | aname |
1 | Lucy |
2 | Lily |
3 | Kimi |
表B引用表A的aid作為外鍵
bcode | aid(FK from A) | bvalue |
001 | 1 | bone |
002 | 2 | btwo |
003 | 5 | bthree |
由于表B中的“aid”字段引用了表A的“aid”,因此,如果此時想修改表B的定義結構,即會出現(xiàn)文章最開始出錯的信息,修改失敗。就是因為表B中的第三條數(shù)據,引用的“aid”為“5”的那條記錄,因為表A中不存在這條記錄,修改表之前的驗證無法通過。只有刪除了這條數(shù)據之后,再次修改表B才會成功。
PS:正常情況下,如何使用了“強制外鍵約束”,則不會出現(xiàn)上面的問題。因為存在外鍵引用,是無法刪除被引用表某些數(shù)據的。如果將“強制外鍵約束”選項是“否”。則可以刪除相應的數(shù)據。
參考文獻:
[1] ALTER TABLE 語句與 COLUMN FOREIGN KEY 約束 '' 沖突 ,大尾巴狼專欄
新聞熱點
疑難解答