2013-05-11 146 views
1

我試圖做到這一點:複合主鍵和自動增量列,但不是主要的關鍵

INSERT INTO `tbl_result` (`var1`, `var2`, `var3`, `year`, `result`) 
VALUES (%f, %f, %d, %d, %f) 
ON DUPLICATE KEY UPDATE result=%f; 

這些都是我想在tbl_result數據庫表中唯一存儲的實時計算的結果,並保持更新即使計算結果發生變化。以上對我來說似乎是最好的方式來做到這一點。

但是這個工作var1var2var3year必須是主鍵:

CREATE TABLE `tbl_result` (
    `ID` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT , 
    `var1` DECIMAL(6,2) UNSIGNED NOT NULL , 
    `var2` DECIMAL(3,2) UNSIGNED NOT NULL , 
    `var3` INT(11) UNSIGNED NOT NULL , 
    `year` INT(4) UNSIGNED NOT NULL , 
    `result` DECIMAL(8,4) NOT NULL , 
    PRIMARY KEY (`var1`, `var2`, `var3`, `year`) 
); 

但是,因爲我也需要存儲的ID是唯一跨多個用戶參考結果。我收到以下錯誤:

錯誤代碼:1075.錯誤的表定義;只能有一個自動列,它必須被定義爲一個鍵

MySql版本是5.5.31-0ubuntu0.12.04.1,是否可以使用guid值設置列的默認值?

感謝, P.

附:這聽起來像是一個合理的場景,是否有可能向MySql報告建議?

+0

爲什麼不能將當前的'PRIMARY KEY'更改爲'UNIQUE'約束? – dan04 2013-05-11 19:07:46

+0

MySQL沒有真正的序列。如果您可以切換到具有序列(PostgreSQL,Oracle)或身份(MSSQL)的另一個數據庫,則可以執行此操作 – mvp 2013-05-11 19:08:24

回答

2

一種解決方法是使用ID作爲主鍵,var1, var2, var3, year領域作爲備用鑰匙通過使用UNIQUE KEY約束

所以,你的表定義應該是這樣的:

CREATE TABLE `tbl_result` (
    `ID` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT , 
    `var1` DECIMAL(6,2) UNSIGNED NOT NULL , 
    `var2` DECIMAL(3,2) UNSIGNED NOT NULL , 
    `var3` INT(11) UNSIGNED NOT NULL , 
    `year` INT(4) UNSIGNED NOT NULL , 
    `result` DECIMAL(8,4) NOT NULL , 
    PRIMARY KEY (`ID`), 
    UNIQUE KEY (`var1`, `var2`, `var3`, `year`) 
); 

UNIQUE KEY約束將防止重複插入您的字段。