0

我写了一个 MySQL 触发器,它会在插入新评论时更新产品的平均评分。但是,进行插入时会引发以下数据库异常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。

4

2 回答 2

6

“数值超出范围”表示该数字对于为其分配的位置来说太大了。DECIMAL(1,1) 是一个很小的分配,所以这并不奇怪。

文档中:

在 DECIMAL 列声明中,可以(并且通常是)指定精度和小数位数;例如:

工资 DECIMAL(5,2)

在此示例中,5 是精度,2 是比例。精度表示为值存储的有效位数,小数位数表示可以存储在小数点后的位数。

标准 SQL 要求 DECIMAL(5,2) 能够存储具有五位和两位小数的任何值,因此可以存储在薪水列中的值范围为 -999.99 到 999.99。

从这里可以看出,DECIMAL(1,1) 意味着您可以只存储一个数字。如果您尝试存储多个数字,则该位置对于该位置来说太大了。

编辑

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

于 2013-10-21T17:37:18.697 回答
0

DECIMAL(1,1)没有意义。@spsc_tech 引用的 MySql 文档对此进行了解释。如果您计算平均值并且它的结果将是小数字,并且您只需要 1 位精度,我建议您将其转换为DECIMAL(2,1). 你的范围从 -9,9 到 9,9

于 2013-10-21T18:01:25.210 回答