我将使用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
它允许我这样做。有什么想法吗?
答案 0 :(得分:1)
目前MySQL不支持check
,这意味着它会解析您的定义但忽略check
部分。
CHECK子句被解析但被所有存储引擎忽略。
要实现相同目的,您可以定义触发器并在必要时使用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节, “外键差异”。
答案 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'不能为空