1

私はこれを達成しようとしています:

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

これらは、tbl_result データベース テーブルに一意に格納し、計算結果が変化しても更新を維持したいリアルタイム計算機の結果です。上記は、これを行うための最良の方法のように思えます。

ただし、これが機能するvar1には、、、、が主キーvar2var3あるyear必要があります。

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。テーブル定義が正しくありません。自動列は 1 つしか存在できず、キーとして定義する必要があります

MySql のバージョンは 5.5.31-0ubuntu0.12.04.1 ですが、カラムのデフォルトを GUID 値で設定することはできますか?

ありがとう、P.

PSこれはもっともらしいシナリオのように思えますが、MySqlに提案を報告することは可能ですか?

4

1 に答える 1

2

これに対する 1 つの解決策は、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重複挿入が防止されます。

于 2013-05-11T19:21:22.863 に答える