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

标签 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。表定义不正确; auto列只能有一个,必须定义为key

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

谢谢,

附言这对我来说听起来像是一个合理的场景,是否可以向 MySql 报告建议?

最佳答案

一个解决方案是使用 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 约束将防止重复插入您的字段。

关于mysql - 复合主键和自动增量列但不是主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16500712/

相关文章:

mysql - 无法刷新 Vaadin JPAContainer 嵌套属性

mysql - 如何将自动递增值 append 到重复值?

sql - apache derby:为列 “GENERATED BY DEFAULT AS IDENTITY”指定ID

mysql - 模拟 "create user if not exists"语法错误

mysql - Laravel 动态查询等于任何值

jQuery 表单输入建议

mysql - 特定表自动递增 2(无 php 处理)

php - 选择前 5 个结果 : PHP/SQL

MySQL:为一条插入语句手动增加 varchar

android - 在 Android 的 Room 库中重置自动增量