CREATE TABLE và ràng buộc
Nội dung bài · 5 mục
- 1.Khái niệm
- 2.Ví dụ
- 3.Thử ngay
- 4.Lỗi hay gặp
- 5.Tóm tắt
Cửa hàng cần thêm bảng mã giảm giá. Mã không được trùng, phần trăm giảm chỉ từ 1 đến 50. Nếu chỉ kiểm tra trong code thì chỉ cần quên kiểm tra ở một chỗ là dữ liệu sai lọt vào. Ràng buộc giúp database tự chặn dữ liệu sai.
Khái niệm
🏗️ CREATE TABLE: câu lệnh tạo bảng mới, khai báo tên cột, kiểu dữ liệu và ràng buộc của từng cột.
🛡️ Ràng buộc (constraint): quy tắc database tự kiểm tra mỗi lần thêm hay sửa dữ liệu, dữ liệu vi phạm bị từ chối.
| Ràng buộc | Ý nghĩa |
|---|---|
PRIMARY KEY |
khoá chính: không trùng, không NULL |
NOT NULL |
bắt buộc có giá trị |
UNIQUE |
không được trùng |
CHECK (điều kiện) |
giá trị phải thoả điều kiện |
REFERENCES bảng (cột) |
khoá ngoại |
DEFAULT giá_trị không phải ràng buộc, nhưng hay đi kèm: câu INSERT không
ghi cột này thì cột nhận giá trị đó.
Ví dụ
CREATE TABLE coupons_demo (
coupon_id NUMBER GENERATED BY DEFAULT AS IDENTITY
PRIMARY KEY,
code VARCHAR2(20) NOT NULL UNIQUE,
percent NUMBER NOT NULL
CHECK (percent BETWEEN 1 AND 50),
active NUMBER(1) DEFAULT 1 NOT NULL
);codebắt buộc có giá trị và không được trùng.CHECK (percent BETWEEN 1 AND 50)chặn mọi giá trị ngoài khoảng.CHECK (status IN ('NEW', 'PAID'))làm việc giống enum ở khoá C# Core, chặn giá trị ngoài danh sách.activemặc định là 1. Oracle 19c chưa có kiểuBOOLEANcho cột, nên thường dùngNUMBER(1)với 1 là có, 0 là không.
Thử ngay
CREATE TABLE coupons (
coupon_id NUMBER GENERATED BY DEFAULT AS IDENTITY
PRIMARY KEY,
code VARCHAR2(20) NOT NULL UNIQUE,
percent NUMBER NOT NULL
CHECK (percent BETWEEN 1 AND 50),
active NUMBER(1) DEFAULT 1 NOT NULL
);
INSERT INTO coupons (code, percent) VALUES ('SALE10', 10);
SELECT coupon_id, code, percent, active FROM coupons;Đoán trước khi chạy: câu INSERT không ghi coupon_id và active. Hai
cột này có giá trị gì?
Xem kết quả
| COUPON_ID | CODE | PERCENT | ACTIVE |
|---|---|---|---|
| 1 | SALE10 | 10 | 1 |
coupon_id được identity tự cấp, là 1. active lấy giá trị DEFAULT là 1.
Lỗi hay gặp
Thêm dữ liệu vi phạm CHECK. Với bảng coupons vừa tạo ở trên, Oracle
báo lỗi ORA-02290: vi phạm ràng buộc kiểm tra.
-- SAI — lỗi: 80% nằm ngoài khoảng 1 đến 50
INSERT INTO coupons (code, percent) VALUES ('BIG', 80);Mã giảm trong khoảng 1 đến 50, như VALUES ('BIG', 50), thì được thêm bình
thường.
Khai báo VARCHAR2(n) rồi lưu chữ tiếng Việt. Mặc định n tính theo
byte, mà chữ có dấu như "ũ" chiếm 2 byte. "Dũng" có 4 chữ nhưng tới 5
byte, nên Oracle báo lỗi ORA-12899: giá trị quá dài.
-- SAI — lỗi: 'Dũng' cần 5 byte
CREATE TABLE staff_bytes (name VARCHAR2(4));
INSERT INTO staff_bytes (name) VALUES ('Dũng');-- ĐÚNG — thêm CHAR để tính theo số ký tự
CREATE TABLE staff (name VARCHAR2(4 CHAR));
INSERT INTO staff (name) VALUES ('Dũng');Tóm tắt
CREATE TABLEkhai báo cột, kiểu dữ liệu và ràng buộc.- Ràng buộc để database tự chặn dữ liệu sai:
NOT NULL,UNIQUE,CHECK, khoá chính, khoá ngoại. DEFAULTcho cột giá trị sẵn khiINSERTkhông ghi tới.- Lưu tiếng Việt thì dùng
VARCHAR2(n CHAR)để tính theo số ký tự.
Tự kiểm tra
0/3 câuEmail của khách không được trùng nhưng được phép để trống. Khai báo nào đúng?
Số lượng tồn kho không được âm. Ràng buộc nào phù hợp?
Cột city VARCHAR2(10). Lưu 'Đà Nẵng' (7 chữ) bị lỗi ORA-12899. Vì sao?