📜  SQLite主键

📅  最后修改于: 2020-11-13 01:09:44             🧑  作者: Mango

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语句创建主键。相反,您必须使用主键创建一个新表并复制旧表中的所有数据。

句法:

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:它对必须更改的表进行分类。
    • Constraint_name:它指定primary_key的名称。
    • pk_col1,pk_col2,… pk_col_n:指定构成主键的列的名称。

例:

创建一个没有主键的“员工”表。

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; 

现在,它将雇员表重命名为“ old_employees”,然后创建一个新表“ employees”,并将所有数据从onld表转移到新表。

现在,您可以删除“ 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”,我们必须删除该主键。

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; 

现在,从现有的“工程师”表中删除了主键。但是原始表现在已重命名为“ old_engineers”。

现在删除“ old_engineers”表。

DROP TABLE old_engineers;