Định nghĩa cấu trúc trước khi thêm bản ghi
Ví dụ dưới đây dùng cú pháp **SQLite** để tạo hai bảng hư cấu. `TEXT` lưu mã và tên dưới dạng văn bản; mã là khóa chính nên không được trùng. Bảng **BanNhac** đặt `MaTacGia` làm khóa ngoài tham chiếu bảng **TacGia**.
```sql
CREATE TABLE TacGia (
MaTacGia TEXT PRIMARY KEY,
TenTacGia TEXT NOT NULL
);
CREATE TABLE BanNhac (
MaBai TEXT PRIMARY KEY,
TenBai TEXT NOT NULL,
MaTacGia TEXT NOT NULL,
FOREIGN KEY (MaTacGia)
REFERENCES TacGia(MaTacGia)
);
```
`CREATE TABLE` thuộc nhóm **DDL**: lệnh tạo cấu trúc, chưa tự thêm tác giả hay bản nhạc. `PRIMARY KEY` phân biệt các hàng trong mỗi bảng; `FOREIGN KEY ... REFERENCES ...` nêu quan hệ giữa hai bảng. Hệ QTCSDL chỉ kiểm quan hệ ấy khi ràng buộc khóa ngoài được bật và thực thi.
Đọc cấu trúc từ câu lệnh
Nếu sau đó thêm tác giả `T01` rồi thêm bản nhạc `K01` có `MaTacGia = 'T01'`, mã tác giả của K01 tìm được ở bảng TacGia. Nếu dùng `T99` khi chưa có tác giả tương ứng, hệ có bật ràng buộc khóa ngoài sẽ từ chối bản ghi ấy.
SGK minh họa `CREATE DATABASE` và `ALTER TABLE`; không phải hệ QTCSDL nào cũng dùng cùng cú pháp cho hai lệnh này. Ví dụ trên khai báo khóa ngay khi tạo bảng, phù hợp cách chạy thử bằng SQLite và vẫn giữ đúng ý **tạo bảng, định kiểu, định khóa** của bài.
Bài luyện
Trong ví dụ, `MaBai TEXT PRIMARY KEY` có ý nghĩa nào?
Đây là một trường của BanNhac.
TEXT là kiểu văn bản; PRIMARY KEY chọn trường làm khóa chính.
Khóa chính không được trùng.
Mã tác giả là trường khác.
Lời giải
Dòng khai báo MaBai là trường kiểu văn bản và là khóa chính của BanNhac, nên mỗi hàng phải có một giá trị MaBai riêng, không để trống.
Bài luyện
Dòng `FOREIGN KEY (MaTacGia) REFERENCES TacGia(MaTacGia)` nối hai bảng bằng cách nào?
Tên trường ở hai phía được nêu rõ.
Câu lệnh không nói MaBai hay TenTacGia.
Câu lệnh không ghép hai tên.
FOREIGN KEY chính là khai báo quan hệ.
Lời giải
MaTacGia ở BanNhac là khóa ngoài. Nó dẫn tới MaTacGia là khóa chính ở TacGia, nên có thể tìm tác giả của mỗi bản nhạc.
Bài luyện
Chạy hai lệnh CREATE TABLE trên, nhưng chưa thêm dữ liệu. Kết luận nào đúng?
CREATE TABLE không chèn K01.
Hai lệnh không cấp quyền.
Các trường và khóa đã được định nghĩa; chưa có INSERT.
Không có lệnh DELETE.
Lời giải
CREATE TABLE tạo các bảng và ràng buộc. Vì ví dụ chưa chạy INSERT, hai bảng mới vẫn chưa chứa tác giả hay bản nhạc nào.
Đang học