Postgresql

PRIMARY KEY 和 SERIAL 的區別(帶索引)

  • August 25, 2022

欄位定義為的表之間是否有任何區別

userId serial PRIMARY KEY

和一個欄位定義為的表

userId serial

然後在該欄位上創建一個索引userId

serial是根據定義uniqueNOT NULL但不附帶預設索引。所以我假設兩者在功能上是等效的?

將列定義為將列serial創建為 type integerwithNOT NULLDEFAULT從序列中獲取的值。它不會使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

因此,除非以這種方式聲明,否則不能保證序列列是唯一的

小提琴

引用自:https://dba.stackexchange.com/questions/316026