【问题标题】:Representing a Maximum 1.00 in MySql Decimal syntax在 MySql Decimal 语法中表示最大值 1.00
【发布时间】: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


【解决方案1】:

在 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 ;

【讨论】:

  • 我认为使用 UI 验证会比强制触发更好。可以节省我额外的服务器旅行吗?我正在开发一个 JEE 应用程序。
  • 我认为在 UI 中验证总是更好的主意。从源头检查错误!
【解决方案2】:

只使用一个约束:

ALTER TABLE TABLENAME
ADD CONSTRAINT CK_TABLENAME_COLUMNNAME_BETWEEN01 CHECK (
   COLUMNNAME >= 0 AND COLUMNNAME <= 1
)

-- 更新,我没有读到您指的是 mysql... 以上仅适用于 SQL 服务器-----

不幸的是 MySQL 不支持 SQL 检查约束。您可以出于兼容性原因定义它们,但它们会被忽略。

您必须创建 2 个触发器 BEFORE INSERTBEFORE 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 ;

【讨论】:

猜你喜欢
  • 2014-11-08
  • 2023-01-18
  • 2013-10-06
  • 2019-11-25
  • 2014-04-12
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多