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

dig*_*rld 0 mysql sql triggers decimal

我写了一个 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;
Run Code Online (Sandbox Code Playgroud)

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

我正在使用 MySQL 5.5。

miy*_*oro 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 有两位数字和一位小数。