2015-02-09 33 views
0

一個外鍵表這是在MySQL我的SQL代碼:我不能修改其他表有它在MySQL

create table Table1 
(
    id varchar(2), 
    name varchar(2), 
    PRIMARY KEY (id) 
); 


Create table Table1_Addr 
(
    addid varchar(2), 
    Address varchar(2), 
    PRIMARY KEY (addid) 
); 

Create table Table1_sal 
(
    salid varchar(2), 
    addid varchar(2), 
    id varchar(2), 
    PRIMARY KEY (salid), 
    index(addid), 
    index(id), 
    FOREIGN KEY (addid) REFERENCES Table1_Addr(addid), 
    FOREIGN KEY (id) REFERENCES Table1(id) 
) 

表1和Table1_Addr是Table1_sal有兩個外鍵,這兩個兩個表表。

我的問題是,我不能改變表1的id字段和Table1_Addr的ADDID領域

的錯誤是:

#1451 - Cannot delete or update a parent row: a foreign key constraint 
fails (`avl`.`table1_sal`, CONSTRAINT `table1_sal_ibfk_2` FOREIGN KEY (`id`) 
REFERENCES `table1` (`id`)) 


編輯,答案是:

create table Table1 
(
    id varchar(2), 
    name varchar(2), 
    PRIMARY KEY (id) 
); 


Create table Table1_Addr 
(
    addid varchar(2), 
    Address varchar(2), 
    PRIMARY KEY (addid) 
); 

Create table Table1_sal 
(
    salid varchar(2), 
    addid varchar(2), 
    id varchar(2), 
    PRIMARY KEY (salid), 
    index(addid), 
    index(id), 
    FOREIGN KEY (addid) REFERENCES Table1_Addr(addid)ON UPDATE CASCADE ON DELETE CASCADE, 
    FOREIGN KEY (id) REFERENCES Table1(id)ON UPDATE CASCADE ON DELETE CASCADE 
) 
+1

這就是外鍵的全部要點。它們阻止您創建(或導致)「孤兒」記錄。無論你正在做什麼更新都會導致記錄成爲孤兒,因此查詢被拒絕。 – 2015-02-09 15:07:19

+0

我該如何解決這個問題?我有另一種方法嗎? – UserMat 2015-02-09 15:09:09

+0

需要解決什麼問題?無論是遠程外鍵,所以你可以創建你想要的所有孤兒,或不刪除/更新任何記錄造成這種情況。 – 2015-02-09 15:10:33

回答

1

加上ON UPATE CASCADE後你的外鍵定義

FOREIGN KEY (addid) REFERENCES Table1_Addr(addid) ON UPDATE CASCADE ON DELETE CASCADE, 
    FOREIGN KEY (id) REFERENCES Table1(id) ON UPDATE CASCADE ON DELETE CASCADE 
+0

它顯示我錯誤。你能寫出代碼嗎? – UserMat 2015-02-09 15:18:01

+0

創建表Table1_sal ( salid VARCHAR(2), ADDID VARCHAR(2), ID VARCHAR(2), PRIMARY KEY(salid) 指數(ADDID) 索引(ID), 外鍵( addid)參考Table1_Addr(addid)在更新級聯上, FOREIGN KEY(id)REFERENCES表1(id)更新級聯 ) – Chatz 2015-02-09 15:21:39

+0

我更新了我的答案。 – Cortwave 2015-02-09 15:22:57

0

你的不是問題,能夠改變表1和Table1_Addr的主鍵,是Table1_Addr的外鍵,是關係型數據庫,如MySQL的正常行爲,

+0

謝謝。那麼如果我需要的話,如何刪除一行? – UserMat 2015-02-09 15:19:00

+0

您需要刪除引用到您要刪除的Table1行的所有Table1_sal行。之後,您可以刪除Table1的行。 – 2015-02-09 15:36:19

1

必須設置外鍵爲開啓更新級聯。然後所有子行也將更新

 Create table Table1_sal 
(
    salid varchar(2), 
    addid varchar(2), 
    id varchar(2), 
    PRIMARY KEY (salid), 
    index(addid), 
    index(id), 
    FOREIGN KEY (addid) REFERENCES Table1_Addr(addid) 
    On delete cascade On Update cascade , 
    FOREIGN KEY (id) REFERENCES Table1(id) 
    On delete cascade On Update cascade 
) 
+0

謝謝我可以編輯該行,但我無法刪除它。 – UserMat 2015-02-09 15:25:54

+1

你必須刪除級聯 – Chatz 2015-02-09 15:34:30