2013-05-11 75 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约束将防止重复插入您的字段。