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;