tl; dr
Bây giờ trong Postgres 10, hãy chỉ định GENERATED BY DEFAULT AS IDENTITY
theo tiêu chuẩn SQL.
create table tower
(
npages integer,
ifnds integer,
ifnid integer,
name varchar(20),
towid integer GENERATED BY DEFAULT AS IDENTITY -- per SQL standard
)
Cột nhận dạng
Postgres 10 hiện hỗ trợ khái niệm cột danh tính và sử dụng cú pháp SQL chuẩn. Mặc dù tôi không phải là chuyên gia về MS SQL Server, nhưng tôi tin rằng hỗ trợ tiêu chuẩn mới này là tương đương.
GENERATED … AS IDENTITY
GENERATED … AS IDENTITY
lệnh được sử dụng trong CREATE TABLE
tạo ra một chuỗi ngầm định. Việc tạo, đặt tên, quyền và thả chuỗi đó là minh bạch đối với bạn, không giống như với SERIAL
. Bây giờ rất trực quan. Nếu bạn cấp quyền sử dụng cho bảng, họ sẽ có quyền cho trình tự. Nếu bạn bỏ bảng, trình tự sẽ tự động bị loại bỏ.
Hai hương vị của cú pháp tiêu chuẩn. Sự khác biệt chỉ quan trọng nếu bạn chuyển một giá trị thay vì để một giá trị được tạo ra. Thông thường, mọi người luôn dựa vào giá trị được tạo, vì vậy thông thường bạn sẽ chỉ cần sử dụng phiên bản đầu tiên, GENERATED BY DEFAULT AS IDENTITY
.
-
GENERATED BY DEFAULT AS IDENTITY
- Tạo một giá trị trừ khi
INSERT
lệnh cung cấp một giá trị.
- Tạo một giá trị trừ khi
-
GENERATED ALWAYS AS IDENTITY
- Bỏ qua bất kỳ giá trị nào được cung cấp bởi
INSERT
trừ khi chỉ địnhOVERRIDING SYSTEM VALUE
- Bỏ qua bất kỳ giá trị nào được cung cấp bởi
Xem CREATE TABLE
trang cho tài liệu.
Đọc trang thú vị này
của Peter Eisentraut. Anh ấy giải thích một số vấn đề kỳ lạ với SERIAL
. Không có vấn đề như vậy với tính năng cột danh tính mới. Vì vậy, không có lý do gì để sử dụng SERIAL
nữa, không có nhược điểm, chỉ có thăng trầm; SERIAL
được thay thế bởi GENERATED … AS IDENTITY
.
Lưu ý rằng cột nhận dạng không nhất thiết phải là khóa chính và không được lập chỉ mục tự động. Vì vậy, bạn vẫn cần chỉ định PRIMARY KEY
rõ ràng nếu đó là ý định của bạn (như trường hợp thường xảy ra).
CREATE TABLE person_ (
id_
INTEGER
GENERATED BY DEFAULT AS IDENTITY -- Replaces SERIAL. Implicitly creates a SEQUENCE, specified as DEFAULT.
PRIMARY KEY -- Creates index. Specifies UNIQUE. Marks column for relationships.
,
name_
VARCHAR( 80 )
) ;
Mục đích là để ẩn các chi tiết triển khai nội bộ với bạn. Bạn không cần phải biết tên của trình tự được tạo dưới các trang bìa. Ví dụ:bạn có thể đặt lại bộ đếm qua cột mà không cần biết trình tự bên dưới.
ALTER TABLE person_
ALTER COLUMN id_
RESTART WITH 1000 -- Reset sequence implicitly, without a name.
;
Chỉ định rõ danh tính:
- Đánh dấu cột
NOT NULL
- Tạo một chuỗi
- Loại trình tự khớp với cột (32-bit 64-bit, v.v.)
- Liên kết chuỗi với cột
- Kế thừa các quyền
- Các tầng giảm xuống
- Vẫn được gắn với cột ngay cả khi cột được đổi tên
- Chỉ định trình tự làm nguồn giá trị mặc định cho cột đó
Cột danh tính có thể có các tùy chọn tương tự như CREATE SEQUENCE
:
-
START WITH start
-
MINVALUE minvalue
|NO MINVALUE
-
MAXVALUE maxvalue
|NO MAXVALUE
-
INCREMENT [ BY ] increment
-
CYCLE
|NO CYCLE
-
CACHE
bộ nhớ cache -
OWNED BY NONE
(việc chỉ định quyền sở hữu cho cột danh tính không có ý nghĩa gì đối với tôi vì quyền sở hữu được quản lý tự động)
Ví dụ ngớ ngẩn về các tùy chọn:
id_ INTEGER
GENERATED BY DEFAULT AS IDENTITY (
START WITH 200
MINVALUE 100
MAXVALUE 205
CYCLE
INCREMENT BY 3
) PRIMARY KEY
Thêm 4 hàng: