MySQL约束检查

时间:2014-09-29 02:40:27

标签: mysql sql constraints

我使用以下查询创建了一个表:

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的先生,您是否有任何建议来实施此检查约束而不是使用触发器?

提前致谢!

3 个答案:

答案 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说出来。