FresherKỹ thuậtSQL
Một cột trong SQL có thể có những constraint nào?
Thử trả lời trước
Đáp án mẫu
Constraint là các quy tắc mà database ép buộc trên mọi lần ghi, nên dữ liệu xấu bị từ chối dù ứng dụng nào gửi đến.
- NOT NULL: cột bắt buộc phải có giá trị.
- UNIQUE: không có hai dòng nào chung giá trị. NULL được phép, và đa số engine coi các NULL là khác nhau.
- PRIMARY KEY: định danh một dòng, là sự kết hợp của NOT NULL và UNIQUE. Mỗi bảng chỉ có một.
- FOREIGN KEY: giá trị phải tồn tại trong bảng được tham chiếu, kèm các quy tắc như
ON DELETE CASCADE. - CHECK: điều kiện mà mỗi dòng phải thỏa. MySQL thực thi nó từ 8.0.16.
- DEFAULT: giá trị được dùng khi không truyền giá trị nào. Nói chặt chẽ thì nó không phải ràng buộc, nhưng được khai báo cùng cách.
CREATE TABLE products (
id BIGINT PRIMARY KEY,
sku VARCHAR(40) NOT NULL UNIQUE,
price NUMERIC(10,2) NOT NULL CHECK (price >= 0),
status VARCHAR(20) NOT NULL DEFAULT 'draft',
brand_id BIGINT REFERENCES brands (id)
);
Constraint giữ tính toàn vẹn ở một nơi, còn kiểm tra trong code ứng dụng có thể bị bỏ qua bởi một script hoặc service khác.
Hãy đặt những quy tắc không bao giờ được phá vào constraint, không chỉ trong code.
Ý chính
- NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY, CHECK, DEFAULT
- PRIMARY KEY là NOT NULL cộng UNIQUE
- FOREIGN KEY ép buộc tham chiếu giữa các bảng
- Constraint bảo vệ dữ liệu khỏi mọi client
Câu hỏi nối tiếp thường gặp
- Cột UNIQUE có chứa được nhiều hơn một NULL không?
Lỗi thường gặp
- Chỉ dựa vào validation trong ứng dụng thay vì constraint
- Nghĩ rằng UNIQUE từ chối nhiều NULL ở mọi engine