2

我有这两个表,其中已经有一些数据。

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`))
4

1 回答 1

6

是的,可以添加外键约束,是的,你做得对。

问题是,为了成功添加外键约束,表中的数据必须已经满足该约束,即您的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再次运行您的命令;它应该成功。

于 2013-10-23T19:16:20.287 回答