SQLite PRIMARY KEY 约束用于确保表列中的所有值都是唯一且非空的。一张表只能有一个 PRIMARY KEY 约束,一个主键可以由单列或多列(字段)组成。
SQLite CREATE TABLE PRIMARY KEY 约束
下面提到的语句创建一个名为 Employee 的表,其中包含五列:EmpID、Name、City、Age 和 Salary,其中 PRIMARY KEY 约束应用于列 EmpID。
CREATE TABLE Employee (
EmpID INT NOT NULL PRIMARY KEY,
Name VARCHAR(255),
City VARCHAR(100),
Age INT,
Salary DECIMAL(18,2)
);
或者,也可以按下述方式创建:
CREATE TABLE Employee (
EmpID INT NOT NULL,
Name VARCHAR(255),
City VARCHAR(100),
Age INT,
Salary DECIMAL(18,2),
PRIMARY KEY(EmpID)
);
为 PRIMARY KEY 约束提供名称,并在多个列上定义 PRIMARY KEY 约束(例如 EmpID 和 Name),语句如下:
CREATE TABLE Employee (
EmpID INT NOT NULL,
Name VARCHAR(255),
City VARCHAR(100),
Age INT,
Salary DECIMAL(18,2),
CONSTRAINT PK_Employee PRIMARY KEY(EmpID, Name)
);
SQLite ALTER TABLE PRIMARY KEY 约束
SQLite 不支持 ALTER TABLE 语句向现有表添加 PRIMARY KEY。但是,这可以通过以下步骤来实现:
- 应检查外键约束
- 将表重命名为其他名称
- 创建一个结构相同但添加了主键约束的新表
- 将重命名表中的数据复制到新表
- 最后打开外键约束
例如,要对现有表Employee的EmpID列强制执行PRIMARY KEY约束,可以使用以下语句:
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
ALTER TABLE Employee RENAME TO Employee_old;
CREATE TABLE Employee (
EmpID INT NOT NULL PRIMARY KEY,
Name VARCHAR(255),
City VARCHAR(100),
Age INT,
Salary DECIMAL(18,2)
);
INSERT INTO Employee SELECT * FROM Employee_old;
COMMIT;
PRAGMA foreign_keys=on;
删除PRIMARY KEY 约束
SQLite 不支持 ALTER TABLE 或 DROP 语句从表中删除现有的 PRIMARY KEY 约束。为此,可以使用以下步骤:
- 应检查外键约束
- 将表重命名为其他名称
- 创建一个结构相同但删除主键约束的新表
- 将重命名表中的数据复制到新表
- 最后打开外键约束
例如,要从现有表 Employee 的 EmpID 列中删除 PRIMARY KEY 约束,可以使用以下语句:
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
ALTER TABLE Employee RENAME TO Employee_old;
CREATE TABLE Employee (
EmpID INT NOT NULL,
Name VARCHAR(255),
City VARCHAR(100),
Age INT,
Salary DECIMAL(18,2)
);
INSERT INTO Employee SELECT * FROM Employee_old;
COMMIT;
PRAGMA foreign_keys=on;