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)
我正在尝试将一个名为sender
to 的列添加links_chatpicmessage
到另一个名为auth_user
's id
column的表中.
为实现上述目标,我在终端上尝试以下方法:
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".
该CONSTRAINT
条款是可选的。我建议省略它并始终让 PostgreSQL 自动命名约束,而不命名它你会得到一个逻辑名称
"links_chatpicmessage_sender_fkey" FOREIGN KEY (sender) REFERENCES auth_user(id)
Run Code Online (Sandbox Code Playgroud)
如果INSERT
或UPDATE
因违反约束而失败,这就是您可能想知道的。
所有这些都有些记录在 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)
我知道这个答案是迟到的,我意识到这与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中的发送者相同]
归档时间: |
|
查看次数: |
71180 次 |
最近记录: |