MySQL 检查约束违规
MySQL check constraint violation
我正在使用 Oracle SQL Developer 创建一个 MySQL 数据库。
我为货币创建了一个 table,其中 Currency_Code
列应包含三个字符(仅限字母)、大写货币代码。
当我尝试添加一个值时,它说约束 CHK_Currency_Code_1
已被违反,但我不确定为什么。
我对 SQL 很陌生。这是脚本:
CREATE TABLE IF NOT EXISTS Currency (
Currency_Code CHAR(3) NOT NULL UNIQUE,
PRIMARY KEY ( Currency_Code ),
CONSTRAINT CHK_Currency_Code_1 CHECK ( Currency_Code LIKE '[a-z][a-z][a-z]' ),
CONSTRAINT CHK_Currency_Code_2 CHECK ( Currency_Code = UPPER( Currency_Code ) )
);
INSERT INTO Currency (Currency_Code)
VALUES ('USD');
您的正则表达式约束,
CONSTRAINT CHK_Currency_Code_1 CHECK ( Currency_Code LIKE '[a-z][a-z][a-z]' )
只允许小写,将其转换为只允许大写。
CONSTRAINT CHK_Currency_Code_1 CHECK ( Currency_Code LIKE '[A-Z][A-Z][A-Z]' )
现在,当您 运行 插入时,它将通过 'USD' 大写。
在 MySQL 中,您将使用正则表达式:
CREATE TABLE IF NOT EXISTS Currency (
Currency_Code CHAR(3) NOT NULL UNIQUE,
PRIMARY KEY ( Currency_Code ),
CONSTRAINT CHK_Currency_Code_1 CHECK ( Currency_Code REGEXP '^[A-Z]{3}$' )
);
这假设排序规则不区分大小写。
如果你想坚持区分大小写,你可以使用BINARY
:
CREATE TABLE IF NOT EXISTS Currency (
Currency_Code CHAR(3) NOT NULL UNIQUE,
PRIMARY KEY ( Currency_Code ),
CONSTRAINT CHK_Currency_Code_1 CHECK ( BINARY Currency_Code REGEXP BINARY '^[A-Z]{3}$' )
);
Here 是一个 db<>fiddle.
只需使用 REGEXP 而不是 LIKE。您正在使用正则表达式,但使用了 LIKE 函数,这就是错误。
CREATE TABLE IF NOT EXISTS Currency (
Currency_Code CHAR(3) NOT NULL UNIQUE,
PRIMARY KEY ( Currency_Code ),
CONSTRAINT CHK_Currency_Code_1 CHECK ( Currency_Code REGEXP '[A-Z][A-Z][A-Z]' ),
CONSTRAINT CHK_Currency_Code_2 CHECK ( Currency_Code = UPPER( Currency_Code ) )
);
INSERT INTO Currency (Currency_Code)
VALUES ('USD');
我正在使用 Oracle SQL Developer 创建一个 MySQL 数据库。
我为货币创建了一个 table,其中 Currency_Code
列应包含三个字符(仅限字母)、大写货币代码。
当我尝试添加一个值时,它说约束 CHK_Currency_Code_1
已被违反,但我不确定为什么。
我对 SQL 很陌生。这是脚本:
CREATE TABLE IF NOT EXISTS Currency (
Currency_Code CHAR(3) NOT NULL UNIQUE,
PRIMARY KEY ( Currency_Code ),
CONSTRAINT CHK_Currency_Code_1 CHECK ( Currency_Code LIKE '[a-z][a-z][a-z]' ),
CONSTRAINT CHK_Currency_Code_2 CHECK ( Currency_Code = UPPER( Currency_Code ) )
);
INSERT INTO Currency (Currency_Code)
VALUES ('USD');
您的正则表达式约束,
CONSTRAINT CHK_Currency_Code_1 CHECK ( Currency_Code LIKE '[a-z][a-z][a-z]' )
只允许小写,将其转换为只允许大写。
CONSTRAINT CHK_Currency_Code_1 CHECK ( Currency_Code LIKE '[A-Z][A-Z][A-Z]' )
现在,当您 运行 插入时,它将通过 'USD' 大写。
在 MySQL 中,您将使用正则表达式:
CREATE TABLE IF NOT EXISTS Currency (
Currency_Code CHAR(3) NOT NULL UNIQUE,
PRIMARY KEY ( Currency_Code ),
CONSTRAINT CHK_Currency_Code_1 CHECK ( Currency_Code REGEXP '^[A-Z]{3}$' )
);
这假设排序规则不区分大小写。
如果你想坚持区分大小写,你可以使用BINARY
:
CREATE TABLE IF NOT EXISTS Currency (
Currency_Code CHAR(3) NOT NULL UNIQUE,
PRIMARY KEY ( Currency_Code ),
CONSTRAINT CHK_Currency_Code_1 CHECK ( BINARY Currency_Code REGEXP BINARY '^[A-Z]{3}$' )
);
Here 是一个 db<>fiddle.
只需使用 REGEXP 而不是 LIKE。您正在使用正则表达式,但使用了 LIKE 函数,这就是错误。
CREATE TABLE IF NOT EXISTS Currency (
Currency_Code CHAR(3) NOT NULL UNIQUE,
PRIMARY KEY ( Currency_Code ),
CONSTRAINT CHK_Currency_Code_1 CHECK ( Currency_Code REGEXP '[A-Z][A-Z][A-Z]' ),
CONSTRAINT CHK_Currency_Code_2 CHECK ( Currency_Code = UPPER( Currency_Code ) )
);
INSERT INTO Currency (Currency_Code)
VALUES ('USD');