[英]Creating vs adding primary (foreign) key constrants
我想知道,這兩種向表添加外鍵(或主鍵)的方式之間有什么區別嗎?
--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);
PRIMARY KEY
沒有什么區別,兩個語句都創建一個PRIMARY KEY
。 有一個差小UNIQUE
約束和PRIMARY KEY
,所述主密鑰被示出為這樣的系統目錄。 兩者都可以作為外鍵的目標,因此沒關系。 PostgreSQL甚至不在乎是否存在適當的UNIQUE
約束,它只是檢查外鍵目標的基礎UNIQUE
索引。
因此,兩個(a)是等效的。 出於外鍵的目的, CREATE UNIQUE INDEX ON my_table(my_table_pk)
使用一個簡單的UNIQUE
約束或一個單獨的CREATE UNIQUE INDEX ON my_table(my_table_pk)
,但是您應該始終使用正確的PRIMARY KEY
定義來創建PK。 一些工具需要知道表的聲明主鍵是什么,並在目錄中查找它。 另外,將來可能會改變。
示例2中的第二部分(b)根本不添加任何約束。 您只是在存儲外部ID的列上創建索引。執行任何操作都需要一個實際的CONSTRAINT
,例如,在您可能會寫的表定義中:
user_id integer REFERENCES "user"(id)
或者,分別聲明約束:
user_id integer,
CONSTRAINT some_fk_name FOREIGN KEY (user_id) REFERENCES "user"(id)
您可以選擇對外鍵列建立索引,這可以使父級上的刪除/更新更快,並且可以改善某些查詢。 但是,外鍵上的索引在執行外鍵約束方面沒有任何作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.