如果表中已有记录,如何创建外键?
Posted
技术标签:
【中文标题】如果表中已有记录,如何创建外键?【英文标题】:How to create foreign key if records are already available in table? 【发布时间】:2017-04-20 20:46:30 【问题描述】: 我正在使用 phpMyAdmin 我创建了 2 个表,Table1 和 Table2。 在 Table1 (id) 中是主键,我忘了创建外键 键入 Table2 并添加 table2 上的所有记录。问题:
如果表2中没有记录,那么我可以创建一个外键,但是如果有记录,我们如何创建外键。
我必须在 Table2 中创建外键。我试过下面的查询
ALTER TABLE Table2
ADD CONSTRAINT FK_User_id
FOREIGN KEY(User_id) REFERENCES Table1(Id)
我在 phpMyadmin 中遇到错误
1452 - 无法添加或更新子行:外键约束失败
【问题讨论】:
请查看我的更新答案,其中突出显示了标记答案的一些潜在问题。 【参考方案1】:您的错误表明它无法创建外键,因为它无法映射某些值。所以在执行此操作之前,请确保 Table2 中所有引用的数据都存在于 Table1 的主键中。
从每个表中查询不同的值,看看有什么区别,并在尝试重新运行更改脚本之前修复数据。
评论后更新:
在 Table2 中,我创建了 User_id 列,它的默认值为 0
针对您的上述评论,您应该使用NULL
作为默认值而不是0
,它应该可以工作。您需要像这样运行更新脚本来将0
值更改为NULL
:
UPDATE Table2
SET User_Id = NULL
WHERE User_Id = 0
标记的答案是建议删除不引用表 1 中记录的数据,但这可能很危险,因为表 2 中的记录在不加入表 1 时可能有效。
例如,假设 Table1 是 CarBuyer
,Table2 是 CarsForSale
。 CarsForSale
有一个买车人的栏目,只有买车的时候才会填,否则应该是NULL
。对于另一个答案,建议是删除所有没有买家的汽车。
【讨论】:
在 Table2 中,我创建了 User_id 列,它的默认值为 0。【参考方案2】:第一步,
ALTER TABLE Table2
ADD User_id1 int
第二步,
ALTER TABLE Table2
ADD CONSTRAINT FK_User_id1
FOREIGN KEY(User_id1) REFERENCES Table1(Id)
第三步,
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)
--你会在这里得到一些记录 --当你删除这些记录时 -- 那么第三步就可以正常运行了。你决定
如果它仍处于开发阶段,那么您可以删除这些记录。 或
遗憾的是你现在不能创建 FK。你仍然可以在 table2 上创建而不是触发器
性能方面两者相同。
【讨论】:
您的错误表明您没有运行我的脚本。看到我创建了新列,然后添加了新的约束名称 FK_User_id1 KumarHarsh 先生,我在第三步中遇到错误。无法添加或更新子行:外键约束失败 Right KumarHarsh,我又试了一次,但在第三步遇到问题。 KumarHarsh 先生,我有一个疑问。我可以删除我之前创建的列名 User_id,因为它没有用处。 因为使用你查询创建了User_id1,也就是外键以上是关于如果表中已有记录,如何创建外键?的主要内容,如果未能解决你的问题,请参考以下文章