Tóm tắt :trong hướng dẫn này, bạn sẽ học cách sử dụng SQLite PRIMARY KEY
ràng buộc để xác định khóa chính cho một bảng.
Giới thiệu về khóa chính SQLite
Khóa chính là một cột hoặc một nhóm cột được sử dụng để xác định tính duy nhất của các hàng trong bảng. Mỗi bảng có một và chỉ một khóa chính.
SQLite cho phép bạn xác định khóa chính theo hai cách:
Trước tiên, nếu khóa chính chỉ có một cột, bạn sử dụng PRIMARY KEY
ràng buộc cột để xác định khóa chính như sau:
CREATE TABLE table_name(
column_1 INTEGER NOT NULL PRIMARY KEY,
...
);
Code language: PHP (php)
Thứ hai, trong trường hợp khóa chính bao gồm hai hoặc nhiều cột, bạn sử dụng PRIMARY KEY
ràng buộc bảng để xác định chính như được hiển thị trong câu lệnh sau.
CREATE TABLE table_name(
column_1 INTEGER NOT NULL,
column_2 INTEGER NOT NULL,
...
PRIMARY KEY(column_1,column_2,...)
);
Code language: SQL (Structured Query Language) (sql)
Trong tiêu chuẩn SQL, cột khóa chính không được chứa NULL
các giá trị. Có nghĩa là cột khóa chính có NOT NULL
ngầm ràng buộc.
Tuy nhiên, để làm cho phiên bản SQLite hiện tại tương thích với phiên bản cũ hơn, SQLite cho phép cột khóa chính chứa NULL
giá trị.
Khóa chính SQLite và bảng rowid
Khi bạn tạo bảng mà không chỉ định WITHOUT ROWID
tùy chọn, SQLite thêm một cột ẩn được gọi là rowid
lưu trữ số nguyên có dấu 64-bit. rowid
cột là một khóa xác định duy nhất các hàng trong bảng. Các bảng có rowid
các cột được gọi là rowid
bảng.
Nếu một bảng có khóa chính bao gồm một cột và cột đó được xác định là INTEGER
thì cột khóa chính này trở thành bí danh cho rowid
cột.
Lưu ý rằng nếu bạn chỉ định một kiểu số nguyên khác, chẳng hạn như BIGINT
và UNSIGNED INT
vào cột khóa chính, cột này sẽ không phải là bí danh cho rowid
cột.
Bởi vì rowid
bảng tổ chức dữ liệu của nó dưới dạng cây B, truy vấn và sắp xếp dữ liệu của một rowid
bảng rất nhanh. Nó nhanh hơn so với việc sử dụng khóa chính không phải là bí danh của rowid
.
Một lưu ý quan trọng khác là nếu bạn khai báo một cột với INTEGER
nhập và PRIMARY KEY DESC
, cột này sẽ không trở thành bí danh cho rowid
cột:
CREATE TABLE table(
pk INTEGER PRIMARY KEY DESC,
...
);
Code language: SQL (Structured Query Language) (sql)
Tạo ví dụ về khóa chính của SQLite
Câu lệnh sau tạo một bảng có tên countries
có country_id
làm khóa chính.
CREATE TABLE countries (
country_id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Hãy thử nó
Vì khóa chính của countries
bảng chỉ có một cột, chúng tôi đã xác định khóa chính bằng PRIMARY KEY
ràng buộc cột.
Có thể sử dụng PRIMARY KEY
ràng buộc bảng để xác định khóa chính bao gồm một cột như được hiển thị trong câu lệnh sau:
CREATE TABLE languages (
language_id INTEGER,
name TEXT NOT NULL,
PRIMARY KEY (language_id)
);
Code language: SQL (Structured Query Language) (sql)
Hãy thử nó
Tuy nhiên, đối với các bảng có khóa chính bao gồm nhiều hơn một cột, bạn phải sử dụng PRIMARY KEY
ràng buộc bảng để xác định khóa chính.
Câu lệnh sau tạo country_languages
bảng có khóa chính bao gồm hai cột.
CREATE TABLE country_languages (
country_id INTEGER NOT NULL,
language_id INTEGER NOT NULL,
PRIMARY KEY (country_id, language_id),
FOREIGN KEY (country_id) REFERENCES countries (country_id)
ON DELETE CASCADE ON UPDATE NO ACTION,
FOREIGN KEY (language_id) REFERENCES languages (language_id)
ON DELETE CASCADE ON UPDATE NO ACTION
);
Code language: PHP (php)
Hãy thử nó
Thêm ví dụ về khóa chính SQLite
Không giống như các hệ thống cơ sở dữ liệu khác, ví dụ:MySQL và PostgreSQL, bạn không thể sử dụng ALTER TABLE
để thêm khóa chính vào bảng hiện có.
Bạn cần làm theo các bước sau để khắc phục hạn chế:
- Đầu tiên, hãy đặt kiểm tra hằng số khóa ngoại.
- Tiếp theo, đổi tên bảng thành một tên bảng khác (old_table)
- Sau đó, tạo một bảng (bảng) mới với cấu trúc chính xác của bảng mà bạn đã được đổi tên.
- Sau đó, sao chép dữ liệu từ old_table vào bảng.
- Cuối cùng, bật kiểm tra ràng buộc khóa ngoại
Xem các câu sau:
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
ALTER TABLE table RENAME TO old_table;
-- define the primary key constraint here
CREATE TABLE table ( ... );
INSERT INTO table SELECT * FROM old_table;
COMMIT;
PRAGMA foreign_keys=on;
Code language: SQL (Structured Query Language) (sql)
Hãy thử nó
BEGIN TRANSACTION
bắt đầu một giao dịch mới. Nó đảm bảo rằng tất cả các câu lệnh tiếp theo thực thi thành công hoặc không có câu lệnh nào thực thi cả.
COMMIT
tuyên bố cam kết tất cả các tuyên bố.
Hãy tạo tên bảng cities
không có khóa chính.
CREATE TABLE cities (
id INTEGER NOT NULL,
name text NOT NULL
);
INSERT INTO cities (id, name)
VALUES(1, 'San Jose');
Code language: SQL (Structured Query Language) (sql)
Hãy thử nó
Để thêm khóa chính vào cities
bảng, bạn thực hiện các bước sau:
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
ALTER TABLE cities RENAME TO old_cities;
CREATE TABLE cities (
id INTEGER NOT NULL PRIMARY KEY,
name TEXT NOT NULL
);
INSERT INTO cities
SELECT * FROM old_cities;
DROP TABLE old_cities;
COMMIT;
PRAGMA foreign_keys=on;
Code language: SQL (Structured Query Language) (sql)
Hãy thử nó
Nếu bạn sử dụng công cụ SQLite GUI, bạn có thể sử dụng câu lệnh sau để hiển thị thông tin của bảng.
PRAGMA table_info([cities]);
Code language: SQL (Structured Query Language) (sql)
Hãy thử nó
Trong hướng dẫn này, bạn đã học cách sử dụng PRIMARY KEY
của SQLite ràng buộc để xác định khóa chính cho một bảng.