簡體   English   中英

創建與添加主(外)關鍵約束

[英]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);

A部分(PK)

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。 一些工具需要知道表的聲明主鍵是什么,並在目錄中查找它。 另外,將來可能會改變。

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)

您可以選擇對外鍵列建立索引,這可以使父級上的刪除/更新更快,並且可以改善某些查詢。 但是,外鍵上的索引在執行外鍵約束方面沒有任何作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM