检查约束失败

时间:2019-09-10 07:48:41

标签: sql sqlite sql-like glob

我正在使用sqlite3

我已经创建了一个像这样的类的表

CREATE TABLE Class (
    ClassID char(5) PRIMARY KEY CHECK (ClassID LIKE 'CT[1-9][A-Z]' OR 'AT[1-9][1-9][A-Z]'),
    ClassQuantity int NOT NULL CHECK (ClassQuantity > 0)
);

当我在此表中插入一些值

INSERT INTO Class
VALUES ('CT2D', 50);

它显示一条错误消息

  

“检查约束失败”。

我已经根据检查条件写了值。有人可以帮我解决这个问题。

3 个答案:

答案 0 :(得分:4)

您错过了在OR那里写OR ClassID LIKE 'AT[1-9][1-9][A-Z]'条件的情况

CREATE TABLE Class (
  ClassID char(5) PRIMARY KEY 
  CHECK (ClassID LIKE 'CT[1-9][A-Z]' OR ClassID LIKE 'AT[1-9][1-9][A-Z]'),
    ClassQuantity int NOT NULL CHECK (ClassQuantity > 0)
);

INSERT INTO Class
VALUES ('CT2D', 50);

答案 1 :(得分:2)

您的检查约束中的LIKE表达式正在尝试使用SQL Server和Sybase等数据库支持的扩展语法。但是,我认为SQLite不支持此语法。解决方法是,如果您的SQLite版本具有REGEXP,我们可以改用它:

CREATE TABLE Class (
    ClassID char(5) PRIMARY KEY CHECK (ClassID REGEXP 'CT[1-9][A-Z]|AT[1-9][1-9][A-Z]'),
    ClassQuantity int NOT NULL CHECK (ClassQuantity > 0)
);

答案 2 :(得分:1)

使用GLOB()。如here

CREATE TABLE Class (
  ClassID char(5) PRIMARY KEY 
  CHECK (ClassID GLOB 'CT[1-9][A-Z]' OR ClassID GLOB 'AT[1-9][1-9][A-Z]'),
    ClassQuantity int NOT NULL CHECK (ClassQuantity > 0)
);

INSERT INTO Class
VALUES ('CT2D', 50);

sqlite dbfiddle

相关问题