Trong PostgreSQL, sequence là một công cụ mạnh mẽ dùng để tạo ra các giá trị số tự tăng – rất hữu ích khi cần tạo khóa chính (primary key) tự động cho bảng dữ liệu. Sequence đảm bảo rằng mỗi giá trị sinh ra là duy nhất, không trùng lặp và có thể kiểm soát được.
Sequence là gì?
Sequence trong PostgreSQL là một object độc lập, không gắn liền với bất kỳ bảng nào. Nó hoạt động như một bộ đếm (counter) có khả năng sinh ra các số tăng dần (hoặc giảm dần), thường được sử dụng để tạo giá trị tự động cho cột id
trong bảng.
Tạo và sử dụng sequence
tạo sequence
CREATE SEQUENCE ten_sequence
START WITH 1
INCREMENT BY 1
MINVALUE 1
NO MAXVALUE
CACHE 1;
Giải thích các tham số:
START WITH
: Giá trị bắt đầuINCREMENT BY
: Bước tăng (có thể âm)MINVALUE
/MAXVALUE
: Giá trị giới hạnCACHE
: Số lượng giá trị được giữ trong bộ nhớ
Lấy giá trị từ sequence
SELECT nextval('ten_sequence'); // lấy giá trị tiếp theo
SELECT currval('ten_sequence'); // lấy giá trị hiện tại
SELECT setval('ten_sequence', 100); // đặt lại giá trị
Ví dụ thực tế
Tạo bảng users
sử dụng sequence làm khóa chính:
CREATE SEQUENCE user_id_seq START WITH 1;
CREATE TABLE users (
id INTEGER DEFAULT nextval('user_id_seq') PRIMARY KEY,
name TEXT NOT NULL
);
INSERT INTO users (name) VALUES ('Alice'), ('Bob');
So sánh sequence, serial và identity
Tiêu chí | SERIAL | IDENTITY (PostgreSQL ≥ 10) | SEQUENCE (thủ công) |
---|---|---|---|
Loại | Kiểu dữ liệu đặc biệt | Tiêu chuẩn SQL | Đối tượng độc lập |
Cú pháp | id SERIAL | `id INT GENERATED [ALWAYS BY DEFAULT] AS IDENTITY` | |
Tự động tạo sequence | Auto tạo sequence | Auto tạo sequence | Phải tạo bằng tay |
Tự động gán giá trị | tự động gán | tự động gán | (phải dùng DEFAULT nextval(...) ) |
Dễ sử dụng | Dễ dùng, phổ biến | Dễ dùng, chuẩn SQL | Cần thao tác thủ công |
Khả năng tùy chỉnh cao | Hạn chế | Trung bình (ALTER được) | Khả năng Tùy biến cao: step, cycle, min/max |
Thay đổi được sequence? | Khó, phải ALTER sequence ngầm | Có thể dùng ALTER TABLE ... | Dễ dàng thay đổi với ALTER SEQUENCE |
Hành vi khi INSERT id | Có thể override | BY DEFAULT : có thể overrideALWAYS : không override | Phụ thuộc vào DEFAULT hoặc không |
Dễ rollback (Flyway, …) | Có thể conflict nếu sequence tự động | Chuẩn hóa, tốt hơn cho migrate | Toàn quyền kiểm soát |
Kết luận
Sequence trong PostgreSQL là một tính năng mạnh mẽ, giúp bạn kiểm soát tốt hơn việc tạo ID tự động. Dù chọn sequence
, serial
hay identity
, điều quan trọng là hiểu rõ nhu cầu của hệ thống để chọn giải pháp phù hợp.
Tham khảo
https://www.postgresql.org/docs/current/sql-createsequence.html
https://neon.com/postgresql/postgresql-tutorial/postgresql-sequences