添加列作为外键会给出外键约束中引用的 ERROR 列不存在

Posted

技术标签:

【中文标题】添加列作为外键会给出外键约束中引用的 ERROR 列不存在【英文标题】:Adding a column as a foreign key gives ERROR column referenced in foreign key constraint does not exist 【发布时间】:2016-06-11 02:39:28 【问题描述】:

我有以下设置,

CREATE TABLE auth_user ( id int PRIMARY KEY );
CREATE TABLE links_chatpicmessage ();

我正在尝试添加一个名为sender 的列links_chatpicmessage,这是另一个名为auth_userid 列的表的外键。

为了实现上述目的,我正在终端上尝试以下操作:

ALTER TABLE links_chatpicmessage
  ADD FOREIGN KEY (sender)
  REFERENCES auth_user;

但这给了我一个错误:

错误:外键约束中引用的列“发件人”没有 存在

我该如何解决这个问题?

【问题讨论】:

auth_user 上的列名称是什么? 我已经为此添加了一个新答案,因为我喜欢更好地解释语法***.com/a/50681996/124486 【参考方案1】:

向列添加约束 它需要首先存在于表中 在 Postgresql 中没有可以使用的命令来同时添加列和添加约束。它必须是两个单独的命令。 您可以使用以下命令:

首先做:

ALTER TABLE links_chatpicmessage ADD COLUMN sender INTEGER;

我在这里使用integer 作为类型,但它应该与auth_user 表的id 列的类型相同。

然后你添加约束

ALTER TABLE links_chatpicmessage 
   ADD CONSTRAINT fk_someName
   FOREIGN KEY (sender) 
   REFERENCES auth_user(column_referenced_name);

此命令的ADD CONSTRAINT fk_someName 部分是命名您的约束,因此如果您以后需要使用一些创建模型的工具对其进行记录,您将拥有一个命名约束而不是随机名称。

它还用于管理员目的,因此 DBA 知道约束来自该表。

通常我们将其命名为带有一些提示,说明它从哪里来,在您的案例中引用它是fk_links_chatpicmessage_auth_user,因此任何看到此名称的人都会确切地知道这个约束是什么,而无需对 INFORMATION_SCHEMA 进行复杂查询来查找出去。

编辑

正如@btubbs 的回答所提到的,您实际上可以在一个命令中添加一个带有约束的列。像这样:

alter table links_chatpicmessage 
      add column sender integer, 
      add constraint fk_test 
      foreign key (sender) 
      references auth_user (id);

【讨论】:

嗨@HassanBaig 我将编辑我的帖子来解释每个部分。 我明白了。 +1 的解释。让我试试 所以我尝试了ALTER TABLE links_chatpicmessage ADD CONSTRAINT fk_links_chatpicmessage_auth_user FOREIGN KEY (sender) REFERENCES auth_user(id);,但我仍然得到column "sender" referenced in foreign key constraint does not exist。我想我错过了一些基本的东西? 是的,对列添加约束 它需要首先存在于表中 mysql 中没有可以同时添加列和添加约束的命令.它必须是两个单独的命令。使用您在 cmets 中发布的命令,但将 TYPE 添加到其中:ALTER TABLE links_chatpicmessage ADD COLUMN sender INTEGER 我在这里使用整数,但它应该与 auth_user (id) 的类型相同 我会将此文本添加到我的答案中,因为我错过了您问题的I want to add a column 部分。 :)【参考方案2】:

您可以在 Postgres 中一行完成此操作:

ALTER TABLE links_chatpicmessage 
    ADD COLUMN sender INTEGER 
    REFERENCES auth_user (id);

您无需手动设置名称。 Postgres 会自动将此约束命名为“links_chatpicmessage_auth_user_id_fkey”。

【讨论】:

我试过了,它肯定在 Postgres 10 中工作。也许不久前接受的答案是正确的,因为不久前无法一次性添加列和外键约束,但现在肯定不再正确了。 这就是我要找的东西,我记得有可能:)【参考方案3】:

我知道这个答案已经晚了,我意识到这和 btubbs one-liner 一样,只是描述性更强......

假设您要引用表 auth_user 中的主键,并且该键名为“id”。

我使用这种语法:

ALTER TABLE links_chatpicmessage 
ADD COLUMN sender some_type,
ADD FOREIGN KEY (sender) REFERENCES auth_user(id);

注意:some_type = [与表 auth_user 中的发送者类型相同]

【讨论】:

【参考方案4】:

CONSTRAINT 子句是可选的。我建议省略它并始终让 PostgreSQL 自动命名约束,不命名它你会得到一个逻辑名称

"links_chatpicmessage_sender_fkey" FOREIGN KEY (sender) REFERENCES auth_user(id)

如果INSERTUPDATE 因违反约束而失败,您可能想知道这一点。

添加外键的语法

所有这些都记录在ALTER TABLE

到一个新列

ALTER TABLE links_chatpicmessage 
  ADD COLUMN sender int,
  ADD [CONSTRAINT foo] FOREIGN KEY (sender) REFERENCES auth_user(id);

这是复合和事务性的。您可以在同一个表上发出两个ALTER 语句,方法是用, 分隔两个语句。

到预先存在的列

-- assumes someone has already added the column or that it already exists
ALTER TABLE links_chatpicmessage
  ADD COLUMN sender int;

ALTER TABLE links_chatpicmessage
  ADD [CONSTRAINT foo] FOREIGN KEY (sender) REFERENCES auth_user(id);

【讨论】:

【参考方案5】:

现有列的外键引用

ALTER TABLE table_name
ADD CONSTRAINT fkey_name
FOREIGN KEY (id)
REFERENCES ref_table(id)

【讨论】:

以上是关于添加列作为外键会给出外键约束中引用的 ERROR 列不存在的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 外键约束中的意外值

无法添加外键约束 MySQL

Oracle表中添加外键约束

Oracle表中添加外键约束

MySQL 无法添加外键约束

在一个命令中添加具有外键约束的新列