mysql - 当表中已经有一些数据时,有没有办法添加外键?

标签 mysql sql

我有这两个表和一些数据。

CREATE TABLE `system_user_data` (
`id_user` bigint(20) NOT NULL AUTO_INCREMENT,
`user_login` varchar(15) DEFAULT NULL,
 PRIMARY KEY (`id_user`)
) ENGINE=InnoDB AUTO_INCREMENT=120 DEFAULT CHARSET=utf8;

CREATE TABLE `system_user_tokens` (
`id_token` bigint(20) NOT NULL AUTO_INCREMENT,
`token_user` bigint(20) DEFAULT NULL,
`token_token` varchar(20) DEFAULT NULL,
`token_createdate` date DEFAULT NULL,
   PRIMARY KEY (`id_token`)
 ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

当我尝试添加外键 token_user=id_user 时出现错误。它在没有任何数据时工作。

alter table system_user_tokens add foreign key (token_user) references system_user_data (id_user);

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`name`.`#sql-1b44_727`, CONSTRAINT `#sql-1b44_727_ibfk_1` FOREIGN KEY (`token_user`) REFERENCES `system_user_data` (`id_user`))

最佳答案

是的,可以添加外键约束,是的,您做对了。

问题是为了成功添加外键约束,表中的数据必须已经满足该约束,即 system_user_tokens.token_user 值的所有行必须存在于 system_user_data.id_user。目前,对于 system_user_tokens 表的一行或多行,情况并非如此。

运行此查询以查找所有违反您尝试添加的外键的行为:

SELECT *
FROM system_user_tokens tok
WHERE NOT EXISTS (
    SELECT * FROM system_user_data u WHERE tok.token_user = u.id_user
)

分析此查询返回的行,修复所有违规,然后再次运行您的 alter 命令;它应该会成功。

关于mysql - 当表中已经有一些数据时,有没有办法添加外键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19550415/

相关文章:

php - 使用一列中的多个值规范化 MySQL 数据库

php - 一个查询中有两种不同的帖子类型

php - 如何从mysql数据库创建图表

php - MySql 循环遍历一列以形成连接的字符串

mysql - 计算 mySQL 中特定用户每天的条目数

PHP、MySQL 查询已执行但表未更新

mysql - 如何在mysql中使用union合并同一个表

mysql - 有两张表 - 一张用于选择,一张用于更新

php - 需要帮助为使用 MAMP 托管的本地 WordPress 导入 SQL 数据库

mysql - 按创建时间+超时排序,MySQL