Postgresql
PRIMARY KEY 和 SERIAL 的區別(帶索引)
欄位定義為的表之間是否有任何區別
userId serial PRIMARY KEY
和一個欄位定義為的表
userId serial
然後在該欄位上創建一個索引
userId
?
serial
是根據定義unique
,NOT NULL
但不附帶預設索引。所以我假設兩者在功能上是等效的?
將列定義為將列
serial
創建為 typeinteger
withNOT NULL
和DEFAULT
從序列中獲取的值。它不會使userid
列唯一:例如,如果您使用顯式值覆蓋預設值,則可以插入一個已經存在的行。缺少兩件事:
- 列上的唯一索引
- 使用上述索引實現的列上的主鍵約束
如果您創建約束,則會自動創建索引。乍一看,約束似乎是一種不必要的裝飾:畢竟,僅索引就已經保證了唯一性。但是,約束是一個好主意的原因有兩個:
- 您需要一個主鍵或唯一約束作為外鍵約束的目標。
- 索引不是 SQL 標準的一部分,但約束是。因此,您只會在 中找到約束
information_schema
,並且使用自省對數據庫結構進行逆向工程的工具比索引更有可能檢測到約束。
不完全相同。例如,您可以不引用外鍵中的序列列,除非它被聲明為 UNIQUE/PRIMARY KEY:
create table T (x serial, y int not null); create table U (x int not null references T(x)); ERROR: there is no unique constraint matching given keys for referenced table "t"
如果您重置序列,您可以重複使用相同的序列號而無需投訴
insert into T (y) values (1),(1),(1); ALTER SEQUENCE T_X_seq RESTART WITH 1; insert into T (y) values (1),(1),(1); select * from T; x y 1 1 2 1 3 1 1 1 2 1 3 1
因此,除非以這種方式聲明,否則不能保證序列列是唯一的