【问题标题】:Cannot add SQL Foreign Key Constraint无法添加 SQL 外键约束
【发布时间】:2017-09-03 23:34:12
【问题描述】:

我有两张桌子。一种叫做BooksRead,一种叫做Authors。 Authors 的主键是 author_last_name 和 author_first_name。

我正在使用 Netbeans IDE。

我想更改还有列 author_last_name 和 author_first_name 的 BooksRead 表,以将 Authors 引用为外键。

ALTER TABLE BooksRead
ADD FOREIGN KEY(AUTHOR_LAST_NAME, AUTHOR_FIRST_NAME) 
REFERENCES AUTHORS(AUTHOR_LAST_NAME, AUTHOR_FIRST_NAME);

我尝试了很多不同的方法——包括添加/命名一个约束——但总是得到同样的错误:

[异常,错误代码 30,000,SQLState X0Y45] 无法在表 BOOKSREAD 中添加或启用外键约束“SQL170903182055780”,因为一个或多个外键没有匹配的引用键。

【问题讨论】:

  • 您使用的是什么 DBMS?是德比吗?
  • 另外,听起来您的BooksRead 表有违反外键约束的数据,即Authors 中没有匹配记录
  • Java DB、Apache Derby。
  • 这就是令人费解的部分——作者的主键是 author_last_name 和 author_first_name。它应该可以工作。
  • 一点也不令人费解。这就是在约束之前开始添加数据时可能发生的情况。

标签: sql foreign-keys derby composite-primary-key


【解决方案1】:

听起来您的BooksRead 表有违反外键约束的数据,即Authors 中没有匹配记录。

在添加约束之前查找并修复记录

SELECT br.*
FROM BooksRead br
WHERE NOT EXISTS (
  SELECT 1 FROM AUTHORS a
  WHERE a.AUTHOR_LAST_NAME = br.AUTHOR_LAST_NAME
  AND a.AUTHOR_FIRST_NAME = br.AUTHOR_FIRST_NAME
)

这将为您提供没有匹配 AUTHOR 的 BooksRead 行列表。你可以

  • 删除这些行
  • 将相关作者详细信息添加到AUTHORS,或
  • 可能BooksRead 中的作者详细信息有拼写错误或前导/尾随空格。修复BooksRead行中的作者详细信息以匹配AUTHORS中的记录

【讨论】:

  • 这是 AUTHORS 表中的一个条目,在“R. R. Martin”之间有一个空格——它把它扔掉了。它应该有“R.R. Martin”。所以,你是对的:当你在约束之前添加数据时会发生这种情况。谢谢!
  • @beh1 现在是标准化您的数据并使用AUTHORS 表中的数字 ID 并引用这些而不是复合键的好时机
【解决方案2】:

您必须检查子表上的现有数据是否作为主键存在于父表上

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 2020-09-12
    • 2017-07-16
    相关资源
    最近更新 更多