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;