Giới thiệu Sequence trong PostgreSQL

2 min read

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 đầu
  • INCREMENT BY: Bước tăng (có thể âm)
  • MINVALUE/MAXVALUE: Giá trị giới hạn
  • CACHE: 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íSERIALIDENTITY (PostgreSQL ≥ 10)SEQUENCE (thủ công)
LoạiKiểu dữ liệu đặc biệtTiêu chuẩn SQLĐối tượng độc lập
Cú phápid SERIAL`id INT GENERATED [ALWAYS BY DEFAULT] AS IDENTITY`
Tự động tạo sequenceAuto tạo sequenceAuto tạo sequencePhải tạo bằng tay
Tự động gán giá trịtự động gántự động gán(phải dùng DEFAULT nextval(...))
Dễ sử dụngDễ dùng, phổ biếnDễ dùng, chuẩn SQLCần thao tác thủ công
Khả năng tùy chỉnh caoHạ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ầmCó thể dùng ALTER TABLE ...Dễ dàng thay đổi với ALTER SEQUENCE
Hành vi khi INSERT idCó thể overrideBY DEFAULT: có thể override
ALWAYS: không override
Phụ thuộc vào DEFAULT hoặc không
Dễ rollback (Flyway, …)Có thể conflict nếu sequence tự độngChuẩn hóa, tốt hơn cho migrateToà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

Avatar photo

Leave a Reply

Your email address will not be published. Required fields are marked *