【问题标题】:SQL ADD CONSTRAINT not working in phpMyAdminSQL ADD CONSTRAINT 在 phpMyAdmin 中不起作用
【发布时间】:2020-08-06 15:58:39
【问题描述】:

我想在我的“响应”表中添加一个外键

ALTER TABLE reponse ADD CONSTRAINT FK_5FB6DEC71E27F6BF FOREIGN KEY (question_id) REFERENCES question (id)

但是,当我尝试该查询时,我得到了那个错误

#1452 - Cannot add or update a child row: a foreign key constraint fails (`my_quizz`.`#sql-3f2_11d`, CONSTRAINT `FK_5FB6DEC71E27F6BF` FOREIGN KEY (`question_id`) REFERENCES `question` (`id`))

我的数据库名为“my_quizz”。

我的“回复”表:

    +------------------+--------------+------+-----+---------+----------------+
| Field            | Type         | Null | Key | Default | Extra          |
+------------------+--------------+------+-----+---------+----------------+
| id               | int(6)       | NO   | PRI | NULL    | auto_increment |
| id_question      | int(11)      | NO   |     | NULL    |                |
| reponse          | varchar(255) | NO   |     | NULL    |                |
| reponse_expected | int(11)      | YES  |     | NULL    |                |
| question_id      | int(11)      | NO   |     | NULL    |                |
+------------------+--------------+------+-----+---------+----------------+

我的“问题”表

    +--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| id           | int(6)       | NO   | PRI | NULL    | auto_increment |
| id_categorie | int(6)       | YES  |     | NULL    |                |
| question     | varchar(255) | YES  |     | NULL    |                |
| q_id         | int(6)       | YES  |     | NULL    |                |
+--------------+--------------+------+-----+---------+----------------+

【问题讨论】:

  • 错误似乎很明显。表中已有外键条件无效的数据。你有什么不明白的?
  • 我想知道我是否可以更新我已经拥有的数据?
  • 列的大小也不同,question_idint(11) question.idint(6),如果您在它们之间添加外键约束,理想情况下它们应该具有相同的大小
  • @harsh 我更改了 int 仍然出现同样的错误

标签: mysql sql database foreign-keys


【解决方案1】:

response 中有行question_idquestion 列的id 列中不存在。您需要在创建约束之前修复这些问题,方法是将response 中的question_id 更改为question(id) 中确实存在的东西,或者在question 中添加缺少的ids。

您可以使用以下查询展示违规值:

select r.question_id
from response r
where not exists (
    select 1
    from question q 
    where q.id = r.question_id
)

【讨论】:

  • 我不确定,该查询中的rq 是什么?我的数据库也链接到我的 symfony 项目,我可以安全地更改列的名称吗?
  • @Hanse: qr 是(分别)questionresponse 的表别名。这不会更改列的名称。
  • 好的!所以该查询显示了 question_id 列,我应该将这些别名添加到我的 ALTER 查询中以使其工作?
  • @Hanse:这与您的 ALTER 表语句无关。如前所述,我给您的查询为您提供了表question 中缺少的question_id 列表。您需要在运行创建外键之前解决此问题 - 如我的回答中所述。
猜你喜欢
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-14
  • 2016-08-16
  • 1970-01-01
  • 2017-09-02
相关资源
最近更新 更多