SQLite主鍵是用於唯一定義行記錄的一個簡單欄位或多個欄位的組合。一個表只能有一個主鍵。
主鍵的值不可以是一個NULL
值。
主鍵通常在建立表時一同建立。在執行CREATE TABLE
語句時可以直接定義主鍵。
語法:
CREATE TABLE table_name
(
column1 datatype [ NULL | NOT NULL ],
column2 datatype [ NULL | NOT NULL ],
......
CONSTRAINT constraint_name PRIMARY KEY (pk_col1, pk_col2, ... pk_col_n)
);
引數說明:
範例:
建立一個「workers
」表,其中worker_id
列是表的主鍵。
CREATE TABLE workers
(
worker_id INTEGER PRIMARY KEY,
last_name VARCHAR NOT NULL,
first_name VARCHAR,
join_date DATE
);
當沒有在CREATE TABLE
語句中定義主鍵時,也可以在建立表後再新增主鍵。
需要注意的是,不能使用ALTER TABLE
語句來建立主鍵。在SQLite中需要先建立一個與原表一樣的新表,並在這個新錶上建立主鍵,然後複製舊表中的所有資料到新表中就可以了。
語法
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
ALTER TABLE table_name RENAME TO old_table;
CREATE TABLE table_name
(
column1 datatype [ NULL | NOT NULL ],
column2 datatype [ NULL | NOT NULL ],
...
CONSTRAINT constraint_name PRIMARY KEY (pk_col1, pk_col2, ... pk_col_n)
);
INSERT INTO table_name SELECT * FROM old_table;
COMMIT;
PRAGMA foreign_keys=on;
引數說明:
範例:
首先建立一個沒有主鍵的表:employees
,如下語句 -
CREATE TABLE employees
(
employee_id INTEGER,
last_name VARCHAR NOT NULL,
first_name VARCHAR,
hire_date DATE
);
現在,執行以下命令將「employee_id
」列設定成為主鍵。
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
ALTER TABLE employees RENAME TO old_employees;
CREATE TABLE employees
(
employee_id INTEGER,
last_name VARCHAR NOT NULL,
first_name VARCHAR,
hire_date DATE,
CONSTRAINT employees_pk PRIMARY KEY (employee_id)
);
INSERT INTO employees SELECT * FROM old_employees;
COMMIT;
PRAGMA foreign_keys=on;
現在,它會將employees
表重新命名為old_employees
,然後建立一個新表employees
並建立主鍵,然後從old_employees
表中將所有資料傳輸到新表 employees
中。
最後刪除舊表:old_employees
。
DROP TABLE old_employees;
與新增主鍵一樣,不能使用ALTER TABLE
語句來刪除主鍵。需要建立一個沒有(刪除)主鍵的新表,並將資料複製到此新表中。
語法
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
ALTER TABLE table_name RENAME TO old_table;
CREATE TABLE table_name
(
column1 datatype [ NULL | NOT NULL ],
column2 datatype [ NULL | NOT NULL ],
...
);
INSERT INTO table_name SELECT * FROM old_table;
COMMIT;
PRAGMA foreign_keys=on;
引數說明
範例:
假設有一個表engineers
,並有一個主鍵:engineer_id
,現在要刪除這個engineer_id
主鍵。
CREATE TABLE engineers
(
engineer_id INTEGER,
engineerr_name VARCHAR NOT NULL,
address VARCHAR,
city VARCHAR,
CONSTRAINT engineers_pk PRIMARY KEY (engineer_id)
);
現在,執行以下命令刪除主鍵。
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
ALTER TABLE engineers RENAME TO old_engineers;
CREATE TABLE engineers
(
engineer_id INTEGER,
engineer_name VARCHAR NOT NULL,
address VARCHAR,
city VARCHAR
);
INSERT INTO engineers SELECT * FROM old_engineers;
COMMIT;
PRAGMA foreign_keys=on;
執行上面語句後,主鍵現在從engineers
表中刪除。 但是原來的表現在被重新命名為old_engineers
。
現在刪除old_engineers
表,如下語句 -
DROP TABLE old_engineers;