复合主键和自动增量列但不是主键

时间:2013-05-11 19:05:08

标签: mysql auto-increment

我正在努力实现这个目标:

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上。

P.S。这对我来说听起来似乎是个合理的场景,是否有可能向MySql报告建议?

1 个答案:

答案 0 :(得分: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约束将阻止您的字段重复插入。