在mysql中插入单行会导致行重复

时间:2012-09-13 09:59:40

标签: php mysql duplicates

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

我正在执行此特定查询,而不是使用某些更具体的函数,因为我注意到有时脚本会插入两行一个,如我所料。

事实上,最后一次选择结果的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;

我在Windows 7 32位和3 GB RAM上使用MySQL 5.1.41,如果这有用的话。

2 个答案:

答案 0 :(得分:1)

最后,当使用AUTO_INCREMENT子句时,在处理ON DUPLICATE KEY UPDATE生成时,这是一个MySQL错误:即使INSERT命中一个唯一键,并且被“转换” “到UPDATE,AUTO_INCREMENT仍然会增加。

这已经被报道:http://bugs.mysql.com/bug.php?id=66807但答案是这不是一个错误。

事实上,阅读此http://dev.mysql.com/doc/refman/5.1/en/innodb-auto-increment-handling.html指出这一切都取决于您的InnoDB配置,即默认配置总是会增加计数器,即使没有执行实际插入,而传统配置会保留计数器如果没有真正的插入,则不变。

答案 1 :(得分:0)

有趣的是,这会暗示MySQL即使没有插入任何内容也会更新AUTO_INCREMENT值。

或者它可能与您的外键有关?尝试在测试环境中删除它们并运行相同的代码 - 如果状态持续存在,我们就有胜利者。