添加列作为外键会给出外键约束中引用的 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_user
的id
列的表的外键。
为了实现上述目的,我正在终端上尝试以下操作:
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)
如果INSERT
或UPDATE
因违反约束而失败,您可能想知道这一点。
添加外键的语法
所有这些都记录在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 列不存在的主要内容,如果未能解决你的问题,请参考以下文章