【问题标题】:MySQL: Alter table to set Foreign keyMySQL:更改表以设置外键
【发布时间】:2015-03-04 16:19:27
【问题描述】:

虽然有一些关于该主题的类似问题,但我找不到我的问题的正确答案。我有 2 个表,分别名为 customercar。我想做的是:当我从数据库中删除一个客户时,我希望属于该客户的汽车也将被自动删除。 MySQL Workbench 为我生成的代码是这样的:

ALTER TABLE `autocare`.`car` 
ADD CONSTRAINT `customerId`
FOREIGN KEY (`CUSTOMER_ID`)
REFERENCES `autocare`.`customer` (`ID`)
ON DELETE CASCADE
ON UPDATE RESTRICT;

我得到这个错误:

ERROR 1452: Cannot add or update a child row: a foreign key constraint fails
(`autocare`.`#sql-80c_388`, CONSTRAINT `customerId` FOREIGN KEY (`CUSTOMER_ID`)
REFERENCES `customer` (`ID`) ON DELETE CASCADE)

以前这些表之间没有关系。有任何想法吗?提前致谢!

【问题讨论】:

  • 问题可能是存在一个car.CUSTOMER_ID,它在customer.ID 中没有匹配的父行。当您尝试添加键约束时,与现有父项不匹配的行会导致约束失败。
  • SELECT * FROM car WHERE CUSTOMER_ID NOT IN (SELECT ID FROM customer)之类的东西找到他们
  • 我明白了。有什么简单的方法可以重置两个表中的所有记录 ID 号吗?我在两个表中都有 50 行。
  • 你不能修改customer.ID而不破坏子表中的现有关系。如果您的目标是级联删除,请先识别 car 中的孤立记录并删除它们,然后添加 FK 约束。
  • 我明白了!如果您回答问题,我可以将其标记为正确答案。感谢您的帮助@MichaelBerkowski

标签: mysql foreign-keys relational-database


【解决方案1】:

您的最终目标是实现从customercar 的级联删除。当您尝试像现在一样使用表添加约束时,它会失败,因为car 表必须包含具有CUSTOMER_ID 值的行,而父表customer 中当前不存在该值。

您应该首先找到这些孤立行并删除它们(因为您的目标是无论如何都要删除它们)。您可以通过以下查询找到它们:

SELECT *
FROM car
WHERE
 CUSTOMER_ID NOT IN (SELECT ID FROM customer)

删除孤立记录后,剩余的现有行可以满足外键约束,您的ALTER TABLE 语句将成功。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-02
    • 2014-12-16
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    相关资源
    最近更新 更多