Sql 创建与添加主(外部)密钥构造

Sql 创建与添加主(外部)密钥构造,sql,postgresql,postgresql-9.2,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 U

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

--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);
A部分(主键)
主键
没有区别,两条语句都创建了一个
主键
唯一
约束和
主键
之间有一个小区别,主键在系统目录中显示。两者都可能是外键的目标,所以这并不重要。PostgreSQL甚至不关心是否存在适当的
UNIQUE
约束,它只检查外键目标的底层
UNIQUE
索引

所以这两个(a)是等价的。出于外键的目的,简单的
UNIQUE
约束或单独的
在my_table(my_table_pk)
上创建唯一索引也是如此,但您应该始终使用适当的
主键定义来创建pk。有些工具需要知道表声明的主键是什么,并在目录中查找它。而且,这在将来可能会改变

B部分(FK) 示例2中的第二部分(b)根本没有添加任何类型的约束。您只是在存储外部ID的列上创建一个索引。执行任何操作都需要实际的
约束
,例如,在表定义中,您可以编写:

user_id integer REFERENCES "user"(id)
或者,声明约束条件:

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

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

@Alex Yes,您可以使用
\dt tablename
或通过检查
信息\u schema
查看表约束来验证。