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.

The docs

要达到同样的效果,您可以定义触发器并在必要时使用 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' 不能为空