如果表中已有记录,如何创建外键?

时间:2016-12-06 09:07:52

标签: mysql sql-server database phpmyadmin

  • 我正在使用phpMyAdmin
  • 我创建了2个表,Table1和Table2。
  • 在Table1(id)中是主键,我忘了创建外键 表2中的键,并添加了table2上的所有记录。

问题:

如果table2中没有记录,那么我可以创建一个外键,但如果有记录,我们如何创建外键。

我必须在Table2中创建外键。我试过下面的查询

ALTER TABLE Table2 
ADD CONSTRAINT FK_User_id
FOREIGN KEY(User_id) REFERENCES Table1(Id)

我在phpMyadmin

中收到错误
  

1452 - 无法添加或更新子行:外键约束失败

2 个答案:

答案 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为CarsForSaleCarsForSale有一个购买汽车的人的列,只有在购买汽车时才会填充,否则应该是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上创建而不是触发器

性能方面两者都是一样的。