SQLite主鍵是用于唯一定義行記錄的一個(gè)簡(jiǎn)單字段或多個(gè)字段的組合。一個(gè)表只能有一個(gè)主鍵。
主鍵的值不可以是一個(gè)NULL
值。
主鍵通常在創(chuàng)建表時(shí)一同創(chuàng)建。在執(zhí)行CREATE TABLE
語(yǔ)句時(shí)可以直接定義主鍵。
語(yǔ)法:
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)
);
參數(shù)說(shuō)明:
示例:
創(chuàng)建一個(gè)“workers
”表,其中worker_id
列是表的主鍵。
CREATE TABLE workers
(
worker_id INTEGER PRIMARY KEY,
last_name VARCHAR NOT NULL,
first_name VARCHAR,
join_date DATE
);
當(dāng)沒(méi)有在CREATE TABLE
語(yǔ)句中定義主鍵時(shí),也可以在創(chuàng)建表后再添加主鍵。
需要注意的是,不能使用ALTER TABLE
語(yǔ)句來(lái)創(chuàng)建主鍵。在SQLite中需要先創(chuàng)建一個(gè)與原表一樣的新表,并在這個(gè)新表上創(chuàng)建主鍵,然后復(fù)制舊表中的所有數(shù)據(jù)到新表中就可以了。
語(yǔ)法
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;
參數(shù)說(shuō)明:
示例:
首先創(chuàng)建一個(gè)沒(méi)有主鍵的表:employees
,如下語(yǔ)句 -
CREATE TABLE employees
(
employee_id INTEGER,
last_name VARCHAR NOT NULL,
first_name VARCHAR,
hire_date DATE
);
現(xiàn)在,運(yùn)行以下命令將“employee_id
”列設(shè)置成為主鍵。
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;
現(xiàn)在,它會(huì)將employees
表重命名為old_employees
,然后創(chuàng)建一個(gè)新表employees
并創(chuàng)建主鍵,然后從old_employees
表中將所有數(shù)據(jù)傳輸?shù)叫卤?employees
中。
最后刪除舊表:old_employees
。
DROP TABLE old_employees;
與添加主鍵一樣,不能使用ALTER TABLE
語(yǔ)句來(lái)刪除主鍵。需要?jiǎng)?chuàng)建一個(gè)沒(méi)有(刪除)主鍵的新表,并將數(shù)據(jù)復(fù)制到此新表中。
語(yǔ)法
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;
參數(shù)說(shuō)明
示例:
假設(shè)有一個(gè)表engineers
,并有一個(gè)主鍵:engineer_id
,現(xiàn)在要?jiǎng)h除這個(gè)engineer_id
主鍵。
CREATE TABLE engineers
(
engineer_id INTEGER,
engineerr_name VARCHAR NOT NULL,
address VARCHAR,
city VARCHAR,
CONSTRAINT engineers_pk PRIMARY KEY (engineer_id)
);
現(xiàn)在,運(yùn)行以下命令刪除主鍵。
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;
執(zhí)行上面語(yǔ)句后,主鍵現(xiàn)在從engineers
表中刪除。 但是原來(lái)的表現(xiàn)在被重命名為old_engineers
。
現(xiàn)在刪除old_engineers
表,如下語(yǔ)句 -
DROP TABLE old_engineers;