Mysql检查约束不起作用

时间:2016-08-06 10:24:41

标签: mysql database constraints check-constraints

我将使用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它允许我这样做。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

目前MySQL不支持check,这意味着它会解析您的定义但忽略check部分。

  

CHECK子句被解析但被所有存储引擎忽略。

The docs

要实现相同目的,您可以定义触发器并在必要时使用SIGNAL

取消更新/插入
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Invalid P_Id';

但是你的实际问题是你没有将P_Id定义为自动增量PRIMARY KEY。然后数据库为你做了一切。

然后你根本不提供P_Id。数据库从1开始编号此列。

你实际上不应该使用W3Schools。他们的行为很糟糕。

答案 1 :(得分:1)

  

对于其他存储引擎,MySQL Server会解析并忽略FOREIGN   CREATE TABLE语句中的KEY和REFERENCES语法。 CHECK子句   被解析但被所有存储引擎忽略。见1.8.2.3节,   “外键差异”。

你可以参考这个答案CHECK constraint in MySQL is not working

答案 2 :(得分:0)

选项2,将生成的列与CASE语句结合使用,而不是空约束。例如:

New table...

查询正常,0行受影响(0.04秒)

的MySQL>插入人物(P_Id,LastName)值(10,'test');

查询正常,1行受影响(0.00秒)

的MySQL>插入人物(P_Id,LastName)值(0,'test');

错误1048(23000):列'CHECK_GEN_FIELD'不能为空