问题:
如果table2中没有记录,那么我可以创建一个外键,但如果有记录,我们如何创建外键。
我必须在Table2中创建外键。我试过下面的查询
ALTER TABLE Table2
ADD CONSTRAINT FK_User_id
FOREIGN KEY(User_id) REFERENCES Table1(Id)
我在phpMyadmin
中收到错误1452 - 无法添加或更新子行:外键约束失败
答案 0 :(得分:2)
您的错误表明它无法创建外键,因为它有一些值无法映射。因此,在执行此操作之前,请确保Table2中的所有引用数据都存在于Table1的主键中。
查询每个表中的不同值,看看有什么区别,并在尝试重新运行alter脚本之前修复数据。
评论后更新:
在Table2中,我创建了User_id列,其默认值为0
在回复上述评论时,您应该使用NULL
作为默认值,而不是0
,它应该有效。您需要运行这样的更新脚本,将0
值更改为NULL
:
UPDATE Table2
SET User_Id = NULL
WHERE User_Id = 0
标记的答案是建议删除不引用表1中记录的数据,但这可能很危险,因为Table2中的记录在不加入Table1时可能有效。
例如,假设Table1为CarBuyer
,Table2为CarsForSale
。 CarsForSale
有一个购买汽车的人的列,只有在购买汽车时才会填充,否则应该是NULL
。另一个答案是,建议删除所有没有买家的汽车。
答案 1 :(得分:1)
第一步,
ALTER TABLE Table2
ADD User_id1 int
第二步,
ALTER TABLE Table2
ADD CONSTRAINT FK_User_id1
FOREIGN KEY(User_id1) REFERENCES Table1(Id)
第3步,
update Table2 set User_id1 =User_id
请参阅第3步错误有效。因为之前没有FK,所以插入了一些无效数据。
您可以运行此查询,
select [user_id] from table2 A
where not exists(select id from table1 B where b.[user_id]=a.id)
- 你会在这里得到一些记录 - 删除这些记录时 - 然后第3步将运行正常。你决定
如果它仍处于开发阶段,那么您可以删除这些记录。 OR
可悲的是你现在无法创建FK。你仍然可以在table2上创建而不是触发器
性能方面两者都是一样的。