有没有办法在表中已有一些数据时添加外键?

时间:2013-10-23 19:13:07

标签: 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`))

1 个答案:

答案 0 :(得分:4)

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

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