2013-10-21 21 views
0

我已經編寫了一個MySQL觸發器,它在插入新評論時更新產品的平均評分。但是,插入時發生以下數據庫異常Numeric value out of range嘗試在MySQL觸發器中創建DECIMAL(1,1)

值進入的列被設置爲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。

回答

3

「數值超出範圍」表示該數字對於分配的點而言太大。 DECIMAL(1,1)是一個很小的分配,所以這並不奇怪。

documentation

在DECIMAL列聲明,精度和標度可以是(並且通常 是)指定;例如:

薪水DECIMAL(5,2)

在這個例子中,圖5是精度和2是規模。精度 表示爲 值存儲的有效位數,標度表示可以在小數點後存儲的數字位數 。

標準SQL要求DECIMAL(5,2)能夠存儲任何值 與五個數字和兩位小數,使得可以存儲在 salary列範圍從-999.99 999.99值。

正如你由此可以看出,DECIMAL(1,1)意味着你可以存儲恰好有一個數字。如果您嘗試存儲多個數字,則對於該位置來說太大了。

編輯

要有3.5,你需要DECIMAL(2,1)。這是因爲3.5有兩位數字和一位小數位。

+0

平均評分將只會在1和5之間。因此'DECIMAL(1,1)' – diggersworld

+0

@diggersworld然後只需使用INT(可能小int )和你的問題將得到解決。 – miyasudokoro

+0

但我想允許1和5之間的分數,即3.4,2.6,4.8。接受 – diggersworld

0

DECIMAL(1,1)沒有意義。 @spsc_tech引用的MySql文檔解釋了它。 如果你計算平均值,它的結果將是小數字,並且你只需要1位數的精度,我建議你把它作爲DECIMAL(2,1)。 你會有從-9.9到9,9的範圍

+0

平均評分將只會介於1和5之間。因此'DECIMAL(1,1)' – diggersworld

+0

對不起,我編輯了我的答案。 'DECIMAL(2,1)'的範圍是-9,9到9,9。它適合你。 – michalczukm