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

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 是 CarsForSaleCarsForSale有一个买车人的栏目,只有买车的时候才会填,否则应该是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,也就是外键

以上是关于如果表中已有记录,如何创建外键?的主要内容,如果未能解决你的问题,请参考以下文章

参照完整性-外键约束

MySQL 数据库 增删查改克隆外键 等操作

MySQL 数据库 增删查改克隆外键 等操作

( 10 )MySQL中的外键

mysql外键

如何从外键表中检索值?