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