创建和添加主(外部)键约束

时间:2013-12-30 03:27:39

标签: sql postgresql postgresql-9.2

我想知道,这两种向表中添加外键(或主键)的方法有什么不同吗?

--1
--a
ALTER TABLE my_table
  ADD CONSTRAINT my_table_pk PRIMARY KEY(id);

--b
ALTER TABLE my_table
  ADD CONSTRAINT my_table_fk_user_id_to_user FOREIGN KEY (user_id)
      REFERENCES "user" (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION;

--2
--a 
CONSTRAINT my_table_pk PRIMARY KEY (id)

--b
CREATE INDEX fk_my_table_fk_user_id_to_user
  ON my_table
  USING btree
  (user_id);

1 个答案:

答案 0 :(得分:1)

A部分(PK)

PRIMARY KEY没有区别,两个语句都创建PRIMARY KEY UNIQUE约束与PRIMARY KEY之间的一个小差异,因为主键在系统目录中显示如此。两者都可以成为外键的目标,所以它并不重要。 PostgreSQL甚至不关心是否存在正确的UNIQUE约束,它只是检查外键目标的基础UNIQUE索引。

所以两者(a)都是等价的。出于外键的目的,简单的UNIQUE约束或单独的CREATE UNIQUE INDEX ON my_table(my_table_pk)也是如此,但是您应该始终使用正确的PRIMARY KEY定义来创建PK。有些工具需要知道表的声明主键是什么,并在目录中查找。此外,这可能在将来发生变化。

B部分(FK)

示例2中的第二部分(b)根本不添加任何类型的约束。您只是在存储外国ID的列上创建索引。实际需要CONSTRAINT才能执行任何操作,例如在表定义中你可以写:

user_id integer REFERENCES "user"(id)

或,分别声明约束:

user_id integer,
CONSTRAINT some_fk_name FOREIGN KEY (user_id) REFERENCES "user"(id)

您可以选择索引外键列,这样可以更快地对父级进行删除/更新,并可以改进某些查询。外键上的索引在强制执行外键约束方面没有任何作用。