MySQL:无法添加或更新子行:引用 UID 时外键约束失败

标签 mysql sql foreign-keys

我有 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) REFERENCES tbl_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/

相关文章:

mysql 使用前一行的信息更新行

SQL Server-声明局部变量 : "there is already an object named ' ' in the database"

nhibernate - Fluent NHibernate - 加入子类ForeignKey Name

python - 如何在 Django 的单个函数中传递两个不同的参数?

php - 我需要有关 postgresql select 查询语句的帮助

sql-server - 如何重新检查sql server表中已有数据的主/外键约束?

MySQL 连接两个仅部分匹配的表

mysql - 如何将此查询从 MySQL (SQL) 写入 Oracle (SQL)

android - android中大小写敏感

java - @Where 与 @SecondaryTable 不适用于 Hibernate