SQLite CHECK 约束用于确保表的列中的所有值都满足指定的条件。通过在表上定义 CHECK 约束,它限制了可以为此列输入的值。使用 ANDOR运算符,CHECK 约束可以以这样的方式构造:可以根据行中其他列中的值限制某些列中的值。

SQLite CREATE TABLE  CHECK 约束

下面提到的语句创建一个名为 Employee 的表,其中包含五列:EmpID, Name、City、Age 和 Salary,其中 CHECK 约束应用于 Age 列.

CREATE TABLE Employee (
  EmpID INT NOT NULL,
  Name VARCHAR(255),
  City VARCHAR(100),
  Age INT CHECK (Age >= 21),
  Salary DECIMAL(18,2)
); 

或者,也可以如下创建:

CREATE TABLE Employee (
  EmpID INT NOT NULL,
  Name VARCHAR(255),
  City VARCHAR(100),
  Age INT,
  Salary DECIMAL(18,2),
  CHECK (Age >= 21)
); 

为 CHECK 约束提供名称,并定义 CHECK对多列(例如 City 和 Age)的约束,可以使用以下语句:

CREATE TABLE Employee (
  EmpID INT NOT NULL,
  Name VARCHAR(255),
  City VARCHAR(100),
  Age INT,
  Salary DECIMAL(18,2),
  CONSTRAINT CHK_Employee CHECK(Age >= 21 AND City = 'London')
); 

SQLite ALTER TABLE CHECK 约束

SQLite 不支持 ALTER TABLE 语句向现有表添加 CHECK 约束。但是,这可以通过以下步骤来实现:

  • 应检查外键约束
  • 将表重命名为其他名称
  • 创建一个结构相同但添加了CHECK约束的新表
  • 将重命名表中的数据复制到新表
  • 最后打开外键约束

例如,要对现有表 Employee 的 Age 列强制执行 CHECK 约束,可以使用以下语句:

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 CHECK (Age >= 21),
  Salary DECIMAL(18,2)
);

INSERT INTO Employee SELECT * FROM Employee_old;

COMMIT;

PRAGMA foreign_keys=on; 

删除CHECK约束

SQLite 不支持 ALTER TABLE 或 DROP 语句从表中删除现有的 CHECK 约束。为此,可以使用以下步骤:

  • 应检查外键约束
  • 将表重命名为其他名称
  • 创建一个结构相同但删除CHECK约束的新表
  • 将重命名表中的数据复制到新表
  • 最后打开外键约束

例如,要从现有表Employee的Age列中删除CHECK约束,可以使用以下语句:

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;