Mysql 检查约束不起作用
Mysql check Constraint does not work
我将使用 mysql
约束来防止插入小于零的数字。我从 W3schools.
中找到了这个查询
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (P_Id>0)
)
但是当我插入 0
它允许我这样做。有什么想法吗?
目前 MySQL 不支持 check
这意味着它会解析您的定义但会忽略 check
部分。
The CHECK clause is parsed but ignored by all storage engines.
要达到同样的效果,您可以定义触发器并在必要时使用 SIGNAL
取消 update/insert
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Invalid P_Id';
但是你这里的实际问题是你没有将P_Id
定义为自增PRIMARY KEY。然后数据库会为你做所有的事情。
那么您根本就没有提供 P_Id
。数据库编号此列从 1
.
开始
而且您实际上不应该使用 W3School。他们的旅游很糟糕。
For other storage engines, MySQL Server parses and ignores the FOREIGN
KEY and REFERENCES syntax in CREATE TABLE statements. The CHECK clause
is parsed but ignored by all storage engines. See Section 1.8.2.3,
“Foreign Key Differences”.
你可以参考这个答案CHECK constraint in MySQL is not working
选项 2,将生成的列与 CASE 语句结合使用,而不是空约束。例如:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK_GEN_FIELD int AS (CASE WHEN P_Id>0 THEN 1 ELSE NULL END) NOT NULL
);
查询正常,0 行受影响(0.04 秒)
mysql> 插入 Persons (P_Id,LastName) 值 (10,'test');
查询正常,1 行受影响(0.00 秒)
mysql> 插入 Persons (P_Id,LastName) 值 (0,'test');
错误 1048 (23000):列 'CHECK_GEN_FIELD' 不能为空
我将使用 mysql
约束来防止插入小于零的数字。我从 W3schools.
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (P_Id>0)
)
但是当我插入 0
它允许我这样做。有什么想法吗?
目前 MySQL 不支持 check
这意味着它会解析您的定义但会忽略 check
部分。
The CHECK clause is parsed but ignored by all storage engines.
要达到同样的效果,您可以定义触发器并在必要时使用 SIGNAL
取消 update/insertSIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Invalid P_Id';
但是你这里的实际问题是你没有将P_Id
定义为自增PRIMARY KEY。然后数据库会为你做所有的事情。
那么您根本就没有提供 P_Id
。数据库编号此列从 1
.
而且您实际上不应该使用 W3School。他们的旅游很糟糕。
For other storage engines, MySQL Server parses and ignores the FOREIGN KEY and REFERENCES syntax in CREATE TABLE statements. The CHECK clause is parsed but ignored by all storage engines. See Section 1.8.2.3, “Foreign Key Differences”.
你可以参考这个答案CHECK constraint in MySQL is not working
选项 2,将生成的列与 CASE 语句结合使用,而不是空约束。例如:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK_GEN_FIELD int AS (CASE WHEN P_Id>0 THEN 1 ELSE NULL END) NOT NULL
);
查询正常,0 行受影响(0.04 秒)
mysql> 插入 Persons (P_Id,LastName) 值 (10,'test');
查询正常,1 行受影响(0.00 秒)
mysql> 插入 Persons (P_Id,LastName) 值 (0,'test');
错误 1048 (23000):列 'CHECK_GEN_FIELD' 不能为空