VieTopik
Tiếng HànTiếng AnhIT
  • Góc học tập
Tải app
  • Thư viện
  • Luyện thi
  • Cẩm nang
  • Góc học tập
SQL với OracleThay đổi dữ liệu
Bài 12/16
5 phút

CREATE TABLE và ràng buộc

Nội dung bài · 5 mục
  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 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
);
  • code bắ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.
  • active mặc định là 1. Oracle 19c chưa có kiểu BOOLEAN cho cột, nên thường dùng NUMBER(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 TABLE khai 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.
  • DEFAULT cho cột giá trị sẵn khi INSERT khô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âu
Câu 1

Email của khách không được trùng nhưng được phép để trống. Khai báo nào đúng?

Câu 2

Số lượng tồn kho không được âm. Ràng buộc nào phù hợp?

Câu 3

Cột city VARCHAR2(10). Lưu 'Đà Nẵng' (7 chữ) bị lỗi ORA-12899. Vì sao?

INSERT, UPDATE, DELETETransaction

Nội dung bài

  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 5.Tóm tắt