Database 将列添加为外键会导致外键约束中引用的错误列不存在

Database 将列添加为外键会导致外键约束中引用的错误列不存在,database,postgresql,foreign-keys,alter-table,Database,Postgresql,Foreign Keys,Alter Table,我有以下设置 CREATE TABLE auth_user ( id int PRIMARY KEY ); CREATE TABLE links_chatpicmessage (); 我正在尝试将名为sender的列添加到links\u chatpicmessage中,这是另一个名为auth\u user的id列的表的外键 为了实现上述目标,我正在终端上尝试以下操作: ALTER TABLE links_chatpicmessage ADD FOREIGN KEY (sender) R

我有以下设置

CREATE TABLE auth_user ( id int PRIMARY KEY );
CREATE TABLE links_chatpicmessage ();
我正在尝试将名为
sender
的列添加到
links\u chatpicmessage
中,这是另一个名为
auth\u user
id
列的表的外键

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

ALTER TABLE links_chatpicmessage
  ADD FOREIGN KEY (sender)
  REFERENCES auth_user;
但这给了我一个错误:

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


如何修复此问题?

若要向列添加约束,它需要首先存在于表中,Postgresql中没有可用于添加列并同时添加约束的命令。它必须是两个独立的命令。可以使用以下命令执行此操作:

首先要做的是:

ALTER TABLE links_chatpicmessage ADD COLUMN sender INTEGER;
我在这里使用
integer
作为类型,但它应该与
auth\u user
表的
id
列的类型相同

然后添加约束

ALTER TABLE links_chatpicmessage 
   ADD CONSTRAINT fk_someName
   FOREIGN KEY (sender) 
   REFERENCES auth_user(column_referenced_name);
此命令的
addconstraint fk_someName
部分是命名您的约束,因此,如果您需要使用创建模型的工具记录约束,您将使用命名约束,而不是随机名称

它还用于管理员目的,以便DBA知道约束来自该表

通常,我们给它命名时会提示它从何而来,在您的案例中引用到何处,它将是
fk_links\u chatpicmessage\u auth_user
,因此任何看到此名称的人都将确切知道此约束是什么,而无需对信息模式进行复杂查询

编辑

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

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

您可以在Postgres中的一行中执行此操作:

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

您不需要手动设置名称。Postgres将自动将此约束命名为“links\u chatpicmessage\u auth\u user\u id\u fkey”。

我知道这个答案已经晚了,我意识到这与btubbs一行相同,只是更具描述性

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

我使用以下语法:

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

注意:some_type=[在表auth_user中键入与发送者相同的内容]

约束子句是可选的。我建议使用它,并始终让PostgreSQL自动命名约束,而不命名约束,您将得到一个逻辑名称

"links_chatpicmessage_sender_fkey" FOREIGN KEY (sender) REFERENCES auth_user(id)
如果
插入
更新
由于违反约束而失败,您可能会想知道这一点

添加外键的语法 所有这些都或多或少地记录在

新专栏 这是复合的和事务性的。通过使用
分隔两条语句,可以在同一个表上发出两条
ALTER
语句

到先前存在的列
现有列的外键参考

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

嗨@HassanBaig我将编辑我的帖子来解释每个部分。我明白了+请听我解释。让我试试,因为我尝试了
ALTER TABLE links\u chatpicmessage ADD CONSTRAINT fk\u links\u chatpicmessage\u auth\u user外键(发送方)引用auth\u user(id)但我仍然得到外键约束中引用的
列“sender”不存在
。我想我遗漏了一些基本的东西?是的,正是这样,要向列添加约束,它首先需要存在于表中,mysql中没有可以使用的命令来添加列并同时添加约束。它必须是两个独立的命令。使用您在评论中发布的命令,但添加类型如下:
ALTER TABLE links\u chatpicmessage add COLUMN sender INTEGER
我在这里使用INTEGER,但它应该是与
auth\u user(id)
相同的类型。我将把此文本添加到我的答案中,因为我遗漏了
我想添加一列
您问题的一部分。:)auth_user上的专栏名称是什么?我对这个问题有了一个新的答案,因为我喜欢更好地解释语法。我尝试了这个,它在Postgres 10中肯定有效。也许不久前人们接受的答案是正确的,因为不久前无法一次性添加列和外键约束,但现在肯定不是这样了。这就是我一直在寻找的,我记得这是可能的:)
-- 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);
ALTER TABLE table_name
ADD CONSTRAINT fkey_name
FOREIGN KEY (id)
REFERENCES ref_table(id)