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

Adding a column as a foreign key gives ERROR column referenced in foreign key constraint does not exist

我有以下设置,

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

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

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

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

但这给了我一个错误:

ERROR: column "sender" referenced in foreign key constraint does not exist

我该如何解决这个问题?

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

首先做为:

ALTER TABLE links_chatpicmessage ADD COLUMN sender INTEGER;

我在这里使用 integer 作为类型,但它应该与 auth_user table.

id 列的类型相同

然后你添加约束

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

此命令的 ADD CONSTRAINT fk_someName 部分是 命名 你的约束,所以如果你以后需要用一些创建模型的工具来记录它,你将有一个命名约束而不是随机名称。

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

通常我们给它命名时会提示它来自哪里以及它在您的案例中引用的位置 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);

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

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

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

我知道这个答案来得太晚了,我意识到这与 btubbs 的单行代码相同,只是更具描述性......

假设您要引用 table auth_user 中的主键,并且该键名是 'id'.

我使用这个语法:

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

注意:some_type = [键入与 table 中的发件人相同的内容 auth_user]

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);

这是复合的和事务性的。您可以在同一个 table 上发出两个 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);

现有列的外键引用

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