我使用以下查询创建了一个表:
CREATE Table articulo
(
id_art int NOT NULL,
nom_art varchar (25) DEFAULT 'XXXXXXXXXXXXX',
prec_art decimal (10,5) DEFAULT 0.000,
peso_art decimal (10,5),
existencia float,
color_art int, CONSTRAINT chk_color1 CHECK (color_art between 0 and 20),
um_art varchar (10) DEFAULT 'DEF_PZA',
primary key (id_art)
);
然后,我使用以下代码行测试了Constraint:
INSERT into articulo values (80,'Taza',70.254,10.00,10.00,25,'PZA');
我看到的是约束不起作用。我可以插入25没有任何问题。我在这里查找了有关这方面的主题并发现:
MySQL参考手册说:
CHECK子句被解析但被所有存储引擎忽略。
尝试触发......
我是SQL的先生,您是否有任何建议来实施此检查约束而不是使用触发器?
提前致谢!
答案 0 :(得分:3)
检查约束在mysql中无法正常工作。检查错误报告http://bugs.mysql.com/bug.php?id=3464。
您可以使用以下替代解决方案来设置默认值
CREATE TRIGGER trig_color_art_check BEFORE INSERT ON articulo
FOR EACH ROW
BEGIN
IF (NEW.color_art < 0 OR NEW.color_art > 25 )THEN
SET NEW.color_art=0;
END IF;
END
答案 1 :(得分:2)
在许多情况下,您可以使用表和外键约束替换CHECK约束。这个案例就是其中之一。
create table art_color (
color_art integer not null,
primary key (color_art)
);
insert into art_color values
(0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10),
(11), (12), (13), (14), (15), (16), (17), (18), (19), (20);
CREATE Table articulo
(
id_art int NOT NULL,
nom_art varchar (25) DEFAULT 'XXXXXXXXXXXXX',
prec_art decimal (10,5) DEFAULT 0.000,
peso_art decimal (10,5),
existencia float,
color_art int,
CONSTRAINT chk_color1
foreign key (color_art) references art_color (color_art),
um_art varchar (10) DEFAULT 'DEF_PZA',
primary key (id_art)
);
答案 2 :(得分:0)
在大多数MySQL存储引擎中,约束检查尚未实现(即使经过15年的开发,是的......)。正如成熟RDBMS的许多其他功能一样。也许它们将在未来十年内实施,也许不会......
使用触发器作为错误文本,official documentation说出来。