2012-12-15 37 views
8

Khi tôi thực hiện lệnh SQL sau:ERROR 1452 (23000): Không thể thêm hoặc cập nhật một hàng con: một ràng buộc khoá ngoại thất bại

INSERT INTO test_usershosts (RID,userid,hid,Usr,Pass) 
VALUES (NULL,1,1,"user","pass"); 

Tôi nhận được thông báo lỗi sau:

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint f 
ails (`dm`.`test_usershosts`, CONSTRAINT `test_usershosts_ibfk_1` FOREIGN KEY (` 
userid`) REFERENCES `test_users` (`userid`) ON DELETE CASCADE ON UPDATE CASCADE) 

bảng của tôi:

CREATE TABLE IF NOT EXISTS `test_users` (
`userid` int(11) NOT NULL AUTO_INCREMENT, 
`username` varchar(10) NOT NULL DEFAULT '', 
`password` varchar(50) NOT NULL DEFAULT '', 
PRIMARY KEY (userid) 
) ENGINE=InnoDB; 

INSERT INTO `test_users` (`userid`, `username`, `password) VALUES 
(1120, 'guest', '12250170a9624f336ca24'); 

CREATE TABLE IF NOT EXISTS `test_hosts` (
`hid` int(11) NOT NULL AUTO_INCREMENT, 
`UID` int(11) NOT NULL, 
`name` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
PRIMARY KEY (hid) 
) ENGINE=InnoDB; 

INSERT INTO `test_hosts` (`hid`, `UID`, `name`) VALUES (30, 10, 'MU'); 

CREATE TABLE IF NOT EXISTS `test_usershosts` (
`RID` int(11) NULL AUTO_INCREMENT, 
`userid` int(11) , 
`hid` int(11) , 
`Usr` varchar(100) , 
`Pass` varchar(100) , 
PRIMARY KEY (RID), 
INDEX (userid), 
INDEX (hid), 
FOREIGN KEY (userid) REFERENCES test_users (userid) 
    ON DELETE CASCADE ON UPDATE CASCADE, 
FOREIGN KEY (hid) REFERENCES test_hosts (hid) 
    ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB; 

tôi đã nhìn vào nhiều trường hợp tương tự, nhưng không thể tìm thấy bất kỳ giải pháp. Bất kỳ trợ giúp sẽ được đánh giá cao.

Trả lời

17

Lý do tại sao bạn đang nhận được ngoại lệ đó là bởi vì bạn đang chèn một bản ghi vào bảng test_usershosts giá trị của userID không có trên bảng test_users. Tương tự như giá trị của hid cũng không có trên bảng test_hosts.

Bảng test_usershosts phụ thuộc vào bảng: test_userstest_hosts. Vì vậy, hãy chắc chắn rằng khi chèn bản ghi trên bảng test_usershosts, các giá trị cho hiduserid đã tồn tại trên các bảng chính: test_userstest_hosts.

Thử thực hiện truy vấn này và chắc chắn nó sẽ được chèn vào.

INSERT INTO test_usershosts (RID,userid,hid,Usr,Pass) 
VALUES (NULL,1120,30,'user','pass'); 

Tôi thấy rằng AUTO_INCREMENT tùy chọn trên bảng: test_userstest_hosts, không cần thiết kể từ khi bạn đang cung cấp các giá trị trên tất cả các truy vấn mà bạn đang thực hiện trên hai bảng.

+0

Tôi là một noob khi nó đến sql, đặc biệt là dbs.I quan hệ mặc dù tôi chỉ cần vượt qua id hàng, do đó 1,1 :) – Himal

2

Trong test_users khách của UserID1120 và trong test_hosts giấu = 30

bạn phải thay đổi

INSERT INTO test_usershosts (RID,userid,hid,Usr,Pass) VALUES (NULL,1,1,"user","pass"); 

tới:

INSERT INTO test_usershosts (RID,userid,hid,Usr,Pass) VALUES (NULL,1120,30,"user","pass"); 
+0

Cảm ơn sự giúp đỡ :) – Himal

-1

trong trường hợp của tôi trong trường hợp nó phục vụ ai đó. Tôi đã đấu tranh để tìm ra giải pháp điều thường xảy ra khi tạo khóa chính cũng được đánh dấu là duy nhất. nhưng trong trường hợp của tôi nó chỉ được đánh dấu là chính và nó không được đánh dấu là duy nhất, cho đến khi tôi nhận thấy rằng các tùy chọn unica là "mở" và tôi nhấp vào nó, cho đến khi sau đó tôi để cho mình làm cho mối quan hệ.

Sau đó, để lưu nội dung ... hãy kiểm tra xem các khóa chính của bạn cũng là duy nhất.

+0

Các khóa chính luôn là duy nhất : https://en.m.wikipedia.org/wiki/Primary_key – Gildas

Các vấn đề liên quan