SQLite主鍵
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)
);
參數說明:
- table_name:指定要創建的表的名稱。
- column1,column2:指定要在表中創建的列。
- constraint_name:指定主鍵的名稱。
- 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;
參數說明:
- table_name:指定要創建含有主鍵的表的名稱。
- old_table:指定要被修表的名稱。
- column1,column2:指定要在表中創建的列。
- constraint_name:指定主鍵的名稱。
- pk_col1,pk_col2,… pk_col_n:它指定構成主鍵的列。
示例:
首先創建一個沒有主鍵的表: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;
參數說明
- table_name - 指定要從中刪除主鍵的表的名稱。
- old_table - 指定在刪除主鍵後再創建新表時,將要刪除擁有主鍵的表名稱。
示例:
假設有一個表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;