我有以下设置,

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

我正在try 将add a column命名为senderlinks_chatpicmessage,这是另一个名为auth_userid列的表的外键.

为了实现上述目标,我在终端上try 了以下几种方式:

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

但这给了我一个错误:

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

我该怎么解决这个问题?

推荐答案

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

首先要做的是:

ALTER TABLE links_chatpicmessage ADD COLUMN sender INTEGER;

我在这里使用integer作为类型,但它应该与auth_user表中id列的类型相同.

然后添加约束条件

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

该命令的第ADD CONSTRAINT fk_someName部分是naming您的约束,因此如果您以后需要使用某个创建模型的工具来记录它,您将拥有一个命名的约束,而不是随机的名称.

此外,它还用于管理员目的,以便DBA知道该约束来自该表.

通常,我们使用一些关于它的来源到引用位置的提示来命名它,在您的 case 中,它应该是fk_links_chatpicmessage_auth_user,这样任何看到这个名称的人都会确切地知道这个约束是什么,而不需要对INFORMATION_SCHEMA进行复杂的查询来找出答案.

EDIT

正如@btubbs的回答所提到的,实际上可以在一个命令中添加带有约束的列.就像这样:

alter table links_chatpicmessage 
      add column sender integer, 
      add constraint fk_test 
      foreign key (sender) 
      references auth_user (id);

Database相关问答推荐

在MongoDB的树形 struct 中更新具有给定id的元素

如何在同一个表的派生部分引用主键?

数据库设计:文件路径的首选字段长度

为什么面向对象的数据库还没有成功?

我应该为 Realm 中的每个实体定义主键吗?

SQL Server 中的Is Identity列属性是什么意思?

无法在 MYSQL 5.5 w/MYSQL Workbench 中更改模式名称

按最强 LIKE 排序 SQL?

我们如何保存在 sqlite3 中创建的数据库

判断Android中的应用程序数据库中是否存在列

使用多个数据库模式的 JPA

如何在 PostgreSQL 事务中获得实时?

Redis Pub/Sub 和 Redis Stream 之间的主要区别是什么?

在将字符串插入数据库期间单引号转义

对于 N:M 关系,在 MongoDB 中推荐的级联删除等效项是什么?

查询 oracle clob 列

Phonegap 离线数据库

计算邮政编码...和用户之间的距离.

在两列之间 Select 最近的日期

使用命令行在 Mysql 中导入压缩文件