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:指定要創建的表的名稱。
  • column1column2:指定要在表中創建的列。
  • constraint_name:指定主鍵的名稱。
  • pk_col1pk_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:指定要被修表的名稱。
  • column1column2:指定要在表中創建的列。
  • constraint_name:指定主鍵的名稱。
  • pk_col1pk_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;