尝试在MySQL触发器中创建DECIMAL(1,1)

时间:2013-10-21 17:24:23

标签: mysql sql triggers decimal

我编写了一个MySQL Trigger,可以在插入新评论时更新产品的平均评分。但是,在插入Numeric value out of range时会抛出以下数据库异常。

值所在的列设置为DECIMAL(1,1)

我设置了以下触发器但仍然出错。

CREATE TRIGGER `update_products_average_rating` AFTER INSERT ON  `reviews` 
FOR EACH ROW UPDATE products 
    SET average_rating = ( SELECT CAST( AVG( rating ) AS DECIMAL( 1, 1 ) ) 
    FROM reviews
    WHERE product_id = products.id ) 
WHERE id = NEW.product_id;

我希望AS DECIMAL(1,1)可以解决问题,但事实并非如此。

我正在使用MySQL 5.5。

2 个答案:

答案 0 :(得分:3)

“数值超出范围”表示数字对于分配的点而言太大。 DECIMAL(1,1)是一个很小的分配,所以这并不奇怪。

来自documentation

  

在DECIMAL列声明中,精度和比例可以是(和   通常是)指定;例如:

     

薪水DECIMAL(5,2)

     

在这个例子中,5是精度,2是刻度。精度   表示为其存储的有效位数   值,而比例表示可以的数字位数   存储在小数点后面。

     

标准SQL要求DECIMAL(5,2)能够存储任何值   五位数和两位小数,所以可以存储在   薪水栏的范围是-999.99到999.99。

从中可以看出,DECIMAL(1,1)表示您可以存储一个数字。如果你试图存储多个数字,那么它对于那个数字来说太大了。

修改

要获得3.5,您需要DECIMAL(2,1)。这是因为3.5中有两位数字和一位小数。

答案 1 :(得分:0)

DECIMAL(1,1)没有意义。 @spsc_tech引用的MySql文档解释了它。 如果你计算平均值并且结果将是小数字,并且你只想要1位精度,我建议你施展为DECIMAL(2,1)。 你的范围是-9,9到9,9