3

だから私は次の表を持っています:

mysql> show create table user_api_skills \G
*************************** 1. row ***************************
       Table: user_api_skills
Create Table: CREATE TABLE `user_api_skills` (
  `characterID` int(11) NOT NULL,
  `typeID` int(11) NOT NULL,
  `level` enum('0','1','2','3','4','5') NOT NULL DEFAULT '0',
  `skillpoints` int(11) NOT NULL,
  `currentTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`characterID`,`typeID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

mysql>

そして、そのテーブルで、挿入/更新しようとしている行:

mysql> SELECT * FROM `user_api_skills` WHERE `characterID` =93192782 AND `typeID` =3359;
+-------------+--------+-------+-------------+---------------------+
| characterID | typeID | level | skillpoints | currentTime         |
+-------------+--------+-------+-------------+---------------------+
|    93192782 |   3359 | 3     |      135765 | 2013-09-30 16:58:35 |
+-------------+--------+-------+-------------+---------------------+
1 row in set (0.00 sec)

私のクエリは正しく形成されていると信じており、実行してもエラーや警告はスローされません。

mysql> INSERT INTO user_api_skills (characterID,typeID,level,skillpoints)
VALUES (93192782,3359,4,135765) ON DUPLICATE KEY UPDATE level=4,             
skillpoints=135765,currentTime=NOW();
Query OK, 2 rows affected (0.22 sec)

2行が更新されます(dup updateの挿入から期待されるように)

mysql> SELECT * FROM `user_api_skills` WHERE `characterID` =93192782 AND `typeID` =3359;
+-------------+--------+-------+-------------+---------------------+
| characterID | typeID | level | skillpoints | currentTime         |
+-------------+--------+-------+-------------+---------------------+
|    93192782 |   3359 | 3     |      135765 | 2013-09-30 16:59:13 |
+-------------+--------+-------+-------------+---------------------+
1 row in set (0.00 sec)

mysql> 

ただし、行自体は単一の値 (currentTime) のみを変更します。他の 2 つのフィールドが更新されない理由を誰か説明できますか?

4

1 に答える 1

0

申し訳ありませんが、私はこれを自分で解決しました。level フィールドは ENUM であり、クエリは新しい値を数値として指定しました。クエリを次のように更新すると、期待どおりの結果が得られました。

mysql> INSERT INTO user_api_skills (characterID,typeID,level,skillpoints) VALUES 
(93192782,3359,4,135765) ON DUPLICATE KEY UPDATE level='4', skillpoints=135765, 
currentTime=NOW();

更新に int を提供することで、列挙型の 1 ベースの数値の選択肢に更新されたため、この場合、4 番目の選択肢は「3」です。

于 2013-09-30T18:54:40.780 に答える