提问者:小点点

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


我有以下设置,

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;

但是这给了我一个错误:

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

我该怎么解决这个问题?


共3个答案

匿名用户

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

首先做:

ALTER TABLE links_chatpicmessage ADD COLUMN sender INTEGER;

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

然后你添加约束

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

此命令的< code > ADD CONSTRAINT fk _ someName 部分是为您的约束命名,这样,如果您以后需要用一些创建模型的工具来记录它,您将有一个命名的约束,而不是一个随机的名称。

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

通常我们用一些提示来命名它,比如它从哪里来,在你的例子中引用到哪里,它应该是< code > 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的一行程序一样,只是更具描述性...

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

我使用以下语法:

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

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