将列添加为外键使得外键约束中引用的ERROR列不存在

Has*_*aig 62 database postgresql foreign-keys alter-table

我有以下设置,

CREATE TABLE auth_user ( id int PRIMARY KEY );
CREATE TABLE links_chatpicmessage ();
Run Code Online (Sandbox Code Playgroud)

我正在尝试将一个名为senderto 的列添加links_chatpicmessage到另一个名为auth_user's idcolumn的表中.

为实现上述目标,我在终端上尝试以下方法:

ALTER TABLE links_chatpicmessage
  ADD FOREIGN KEY (sender)
  REFERENCES auth_user;
Run Code Online (Sandbox Code Playgroud)

但这给了我一个错误:

错误:外键约束中引用的列"sender"不存在

我该如何解决?

Jor*_*pos 98

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

首先做:

ALTER TABLE links_chatpicmessage ADD COLUMN sender INTEGER;
Run Code Online (Sandbox Code Playgroud)

integer在这里使用类型,但它应该是表的id列的相同类型auth_user.

然后添加约束

ALTER TABLE links_chatpicmessage 
   ADD CONSTRAINT fk_someName
   FOREIGN KEY (sender) 
   REFERENCES auth_user(column_referenced_name);
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)


btu*_*bbs 66

您可以在Postgres中执行以下操作:

ALTER TABLE links_chatpicmessage ADD COLUMN sender INTEGER REFERENCES auth_user (id);
Run Code Online (Sandbox Code Playgroud)

您无需手动设置名称.Postgres会自动将此约束命名为"links_chatpicmessage_auth_user_id_fkey".


Eva*_*oll 9

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

"links_chatpicmessage_sender_fkey" FOREIGN KEY (sender) REFERENCES auth_user(id)
Run Code Online (Sandbox Code Playgroud)

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

添加外键的语法

所有这些都有些记录在 ALTER TABLE

到新列

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

这是复合和交易性的。您可以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);
Run Code Online (Sandbox Code Playgroud)


Ted*_*ley 7

我知道这个答案是迟到的,我意识到这与btubbs单线程相同,只是更具描述性......

假设您要引用表auth_user中的主键,并且该键名称为"id".

我用这个语法:

ALTER TABLE links_chatpicmessage 
ADD COLUMN sender some_type,
ADD FOREIGN KEY (sender) REFERENCES auth_user(id);
Run Code Online (Sandbox Code Playgroud)

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