我有 2 个表:tbl_usr_info
有一个 UID
,它是一个主键和自动递增,tbl_login_info
有一个 LoginID
(主要)和 UID
以及一些其他信息,如时间戳等。
我试图通过运行此 sql 语句来引用 tbl_login_info
中的 UID 和 tbl_usr_info
中的 UID
CONSTRAINT `uid-info/login` FOREIGN KEY (`UID`) REFERENCES `tbl_usr_info` (`UID`)
但是我收到了这个错误:
Cannot add or update a child row: a foreign key constraint fails (CONSTRAINT
uid-info/login
FOREIGN KEY (UID
) REFERENCEStbl_usr_info
(UID
))
tbl_usr_info 表
CREATE TABLE `tbl_usr_info` (
`UID` int(50) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL DEFAULT '',
`password` varchar(50) NOT NULL DEFAULT '',
`email` varchar(50) NOT NULL DEFAULT '',
PRIMARY KEY (`UID`),
UNIQUE KEY `username` (`username`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
tbl_usr_login 表
CREATE TABLE `tbl_usr_login` (
`LoginID` int(11) NOT NULL AUTO_INCREMENT,
`UID` int(50) NOT NULL,
`ip_address` varchar(55) DEFAULT NULL,
`device` varchar(100) DEFAULT NULL,
`time_stamp` datetime DEFAULT NULL,
PRIMARY KEY (`LoginID`)
)ENGINE=InnoDB DEFAULT CHARSET=latin1;
是我引用它的顺序错了吗?
最佳答案
我测试了你的外键约束,它对我来说没有错误。但是我的 table 是空的。
外键约束最常见的失败类型之一是,当您创建约束时,子表包含一些父表中不存在的值。在这种情况下无法满足外键约束,因此创建约束失败。
您可以检查不匹配的 UID 值:
SELECT COUNT(*)
FROM tbl_usr_login AS l
LEFT OUTER JOIN tbl_usr_info AS i
ON l.UID = i.UID
WHERE i.UID is NULL;
P.S.:这与您的问题无关,但我注意到您使用的是 INT(50)
。 INT 的参数并不代表您认为的意思。 INT(50) 并不意味着您可以存储 50 位数字。请参阅我对 Types in MySQL: BigInt(20) vs Int(20) 的回答
关于MySQL:无法添加或更新子行:引用 UID 时外键约束失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47516393/