我尝试创建一个具有INTEGER属性的表,该属性应限制为正数。我知道有一个UNSIGNED选项,但这是错误的。因为它允许添加-10作为值。它只会产生10个。
是否有可能拒绝错误的条目?我尝试使用CHECK
DROP TABLE Produkt;
CREATE TABLE Produkt (
Bezeichnung VARCHAR(237) PRIMARY KEY,
ProduktNr INTEGER NOT NULL,
Produktart VARCHAR(3) DEFAULT "XXX",
CONSTRAINT onlyPositive CHECK(ProduktNr >= 0)
);
但我仍然可以添加-10作为一个值...我做错了什么?
答案 0 :(得分:4)
1)如果您将列定义为
,则严格按sql_modeProduktNr INT UNSIGNED NOT NULL,
然后尝试插入负值,您将收到错误
ERROR 1264(22003):第1行的'ProduktNr'列超出范围值
这是 SQLFiddle 演示。 取消注释插入语句,然后点击Build Schema
2)MySQL仍然缺乏对CHECK
约束的支持。 The CHECK clause is parsed but ignored by all storage engines
3)旁注:不要将VARCHAR(237)
列用作PRIMARY KEY
,特别是如果您使用的是InnoDB引擎(表中的所有辅助索引也包含PK值)。
答案 1 :(得分:0)
我相信你可以在不命名约束的情况下添加支票。这似乎对我有用:
CREATE TABLE Produkt (
Bezeichnung VARCHAR(237),
ProduktNr INTEGER NOT NULL,
Produktart VARCHAR(3) DEFAULT "XXX",
PRIMARY KEY (Bezeichnung),
CHECK(ProduktNr >= 0)
);
我还移动了主键的声明。我不是100%肯定你可以在一个领域同时宣布一个关键,但我确实放了我所知道的。