我有以下设置,
CREATE TABLE auth_user ( id int PRIMARY KEY );
CREATE TABLE links_chatpicmessage ();
我正在尝试将名为sender
的列添加到links_chatpicmessage
,这是另一个名为auth_user
的{{1}}表的外键}专栏。
为实现上述目标,我在终端上尝试以下方法:
id
但这给了我一个错误:
错误:外键约束中引用的列“sender”不会 存在
我该如何解决这个问题?
答案 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)
如果INSERT
或UPDATE
因违反约束而失败,那么您可能想知道这一点。
所有这些都在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)