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

时间:2016-02-27 22:18:12

标签: database postgresql foreign-keys alter-table

我有以下设置,

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

我正在尝试将名为sender的列添加到links_chatpicmessage,这是另一个名为auth_user的{​​{1}}表的外键}专栏。

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

id

但这给了我一个错误:

  

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

我该如何解决这个问题?

5 个答案:

答案 0 :(得分:88)

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

首先做:

ALTER TABLE links_chatpicmessage ADD COLUMN sender INTEGER;

我在此处使用integer作为类型,但它应与id表的auth_user列的类型相同。

然后添加约束

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

答案 1 :(得分:60)

你可以在Postgres上一行:

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

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

答案 2 :(得分:7)

我知道这个答案是迟到的,我意识到这和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中的发件人相同]

答案 3 :(得分:3)

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

这是复合和交易的。您可以通过用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);

答案 4 :(得分:0)

****现有列的外键参考****

ALTER TABLE table_name添加约束fkey_name外键(id)参考ref_table(id)