我有两张桌子和一些数据。
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`))
答案 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
命令;它应该成功。