1

PHPスクリプトでは、次のことを実行します。

SELECT t1.*, t2.flag_contenuto
FROM lin_98_4_sgs_formazione_elearning_allegati as t1
JOIN agews_elearning_allegati as t2 USING(id_allegato, id_elearning)
WHERE id_dipendente='432'
AND id_sgs_formazione='7'
AND id_azienda='3'
AND id_sede='12'
AND revisione_documento='0'
AND id_allegato='7'

必要な特定の情報を取得するには、現在のタイムスタンプ広告を特定して次のdate('Y-m-d H:i:s')ようにします。

INSERT INTO lin_98_4_sgs_formazione_elearning_statistiche (
  `id_allegato`,
  `id_elearning`,
  `id_dipendente`,
  `id_sgs_formazione`,
  `id_azienda`,
  `id_sede`,
  `revisione_documento`,
  `data_letto`
) VALUES (
  7,
  6,
  432,
  7,
  3,
  12,
  0,
  '2012-09-13 11:50:39' -- timestamp derived as described above
)
ON DUPLICATE KEY UPDATE data_letto=VALUES(data_letto)

最後に、この選択を実行してから、var_dump()その出力を実行します。

SELECT MAX(id_statistica)
FROM lin_98_4_sgs_formazione_elearning_statistiche
WHERE `id_allegato` = 7
AND `id_elearning` = 6
AND `id_dipendente` = 432
AND `id_sgs_formazione` = 7
AND `id_azienda` = 3
AND `id_sede` = 12
AND `revisione_documento` = 0
AND `data_letto` = '2012-09-13 11:50:39'

最後に挿入された行のIDを取得する必要があります。

より具体的な関数を使用する代わりに、この特定のクエリを実行しているのは、予想どおり、スクリプトが 1行ではなく2 行を挿入する場合があることに気付いたからです。

実際、var_dump()最後の選択の結果は、1、2、4、5、6、7、9などのようになり、ランダムに二重挿入を実行することがあります

この問題の原因は何ですか? 完全なテーブル定義は次のとおりです。

CREATE TABLE `lin_98_4_sgs_formazione_elearning_statistiche` (
  `id_statistica` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `id_allegato` int(10) unsigned DEFAULT '0',
  `id_elearning` int(10) unsigned DEFAULT '0',
  `id_dipendente` int(10) unsigned DEFAULT '0',
  `id_sgs_formazione` int(10) unsigned DEFAULT '0',
  `id_azienda` int(10) unsigned NOT NULL DEFAULT '1',
  `id_sede` int(10) unsigned NOT NULL DEFAULT '1',
  `revisione_documento` int(10) unsigned NOT NULL DEFAULT '0',
  `data_letto` datetime DEFAULT NULL,
  `tempo_letto` smallint(5) unsigned DEFAULT '0',
  PRIMARY KEY (`id_statistica`,`id_azienda`,`id_sede`,`revisione_documento`),
  UNIQUE KEY `data_letto` (`data_letto`,`id_allegato`,`id_elearning`,`id_dipendente`,`id_sgs_formazione`,`id_azienda`,`id_sede`,`revisione_documento`),
  CONSTRAINT `fk_id_allegato_lin_98_4_sgs_formazione_elearning_statistiche` FOREIGN KEY (`id_allegato`, `id_elearning`, `id_dipendente`, `id_sgs_formazione`, `id_azienda`, `id_sede`, `revisione_documento`) REFERENCES `lin_98_4_sgs_formazione_elearning_allegati` (`id_allegato`, `id_elearning`, `id_dipendente`, `id_sgs_formazione`, `id_azienda`, `id_sede`, `revisione_documento`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

これが役立つ場合は、3 GB RAM を搭載した Windows 7 32 ビットで MySQL 5.1.41 を使用しています。

4

2 に答える 2

1

最終的に、これは節が使用されAUTO_INCREMENTたときの世代を処理する際の MySQL のバグであることが判明しました。ON DUPLICATE KEY UPDATEINSERTUPDATE

これはすでに報告されています: http://bugs.mysql.com/bug.php?id=66807しかし、これはバグではないと答えています。

実際、このhttp://dev.mysql.com/doc/refman/5.1/en/innodb-auto-increment-handling.htmlを読むと、すべて InnoDB の構成に依存することがわかります。つまり、デフォルトの構成は常に実際の挿入が実行されなかった場合でもカウンターをインクリメントしますが、実際の挿入が行われなかった場合、従来の構成ではカウンターは変更されません。

于 2012-09-13T15:20:24.833 に答える
0

興味深いことに、これは、実際には何も挿入されていない場合でも、MySQLがAUTO_INCREMENT値を更新することを示唆しています。

または、おそらくそれはあなたの外部キーと関係がありますか?テスト環境でそれらを削除し、同じコードを実行してみてください。状態が続く場合は、勝者がいます。

于 2012-09-13T14:11:19.633 に答える