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
查看表约束来验证。