【发布时间】:2014-11-30 17:44:41
【问题描述】:
是否可以有一个 SQL 语法来创建列,强制列值介于 0.00 到 1.00
例子
0.35 --> Correct
2.10 --> Wrong
0.05 --> Correct
为我的列数据类型设置 DECIMAL(3,2) 也允许最大值为 9.99。
我可以将值限制在 0.00 到 1.00 之间吗?
【问题讨论】:
标签: mysql mysql-workbench sqldatatypes
是否可以有一个 SQL 语法来创建列,强制列值介于 0.00 到 1.00
例子
0.35 --> Correct
2.10 --> Wrong
0.05 --> Correct
为我的列数据类型设置 DECIMAL(3,2) 也允许最大值为 9.99。
我可以将值限制在 0.00 到 1.00 之间吗?
【问题讨论】:
标签: mysql mysql-workbench sqldatatypes
在 MySQL 中,您可以定义检查约束,但它们目前尚未实现并且没有效果。但是您可以为此在 MySQL 中使用触发器并检查值并在错误时取消更新/插入
delimiter |
CREATE TRIGGER your_update_trigger BEFORE UPDATE ON your_table
FOR EACH ROW
BEGIN
IF NEW.decimal_column not between 0.0 and 1.0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'An error occurred. Decimal value out of range';
END IF;
END
|
delimiter ;
【讨论】:
只使用一个约束:
ALTER TABLE TABLENAME
ADD CONSTRAINT CK_TABLENAME_COLUMNNAME_BETWEEN01 CHECK (
COLUMNNAME >= 0 AND COLUMNNAME <= 1
)
-- 更新,我没有读到您指的是 mysql... 以上仅适用于 SQL 服务器-----
不幸的是 MySQL 不支持 SQL 检查约束。您可以出于兼容性原因定义它们,但它们会被忽略。
您必须创建 2 个触发器 BEFORE INSERT 和 BEFORE UPDATE
DELIMITER $$
CREATE TRIGGER `insert_trigger` BEFORE INSERT ON TABLENAME
FOR EACH ROW
BEGIN
IF NEW.COLUMNNAME not between 0.0 and 1.0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Decimal value out of range';
END IF;
END$$
CREATE TRIGGER `update_trigger` BEFORE UPDATE ON TABLENAME
FOR EACH ROW
BEGIN
IF NEW.COLUMNNAME not between 0.0 and 1.0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Decimal value out of range';
END IF;
END$$
DELIMITER ;
【讨论】: