2012-04-16 91 views
2

插入我的测试表,这种结构:MySQL在重复键更新PK AI

CREATE TABLE IF NOT EXISTS `test` (
    `id_pc` int(11) NOT NULL AUTO_INCREMENT, 
    `id_vendor` int(11) NOT NULL, 
    `id_product` int(11) NOT NULL, 
    `test` int(11) NOT NULL, 
    PRIMARY KEY (`id_pc`), 
    UNIQUE KEY `id_vendor` (`id_vendor`,`id_product`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

正如你可以看到UQ键被设置在从PK是AI不同的2列。

简单测试查询:

INSERT INTO test(id_vendor, id_product, test) 
VALUES (1,1,1) ON DUPLICATE KEY UPDATE test = 1; 

我每次查询运行它增加AUTO_INCREMENT值(所以没有插件由,只更新)。这是正常的行为还是我错过了什么?

+0

'每次运行查询时,都会增加AUTO_INCREMENT的值(因此不会插入,只会更新)。这是正常行为吗?还是我错过了什么?“首先,这是什么意思?你是否实现了你想要的或想要的东西? – 2012-04-16 09:55:20

+0

你想要发生什么?你想不得不自动递增键吗?或者你希望它只在主键空闲时插入? – Anthony 2012-04-16 10:01:04

+0

'差距'让我感到担忧。真正的表格有更多不同的结构 - 'x'附加字段经常改变,PK不是int(记录数量适中)。所以通过经常更新表的自动增量值最终会超出范围,并且新插入会发生什么?所以我问的是这个mysql的正常行为,当更新被执行时,每个'重复密钥更新'增加这个值? – Bernard 2012-04-16 13:04:54

回答

0

让我们来看看从另一个角度主题:MySQL不会重置表的AUTO_INCREMENT值,除非你告诉它(例如,通过ALTER TABLETRUNCATE TABLE查询)。在你的情况下,它显然需要使用一个值,以便它可以在插入它之前就可以确定它是重复的。

另外:

  • 如果有重复的键,更改列,它是不属于任何键会不由自主的一部分的价值。
  • 通过AUTO_INCREMENT获得的值应该没有意义。如果你担心差距,你正在使用错误的工具来完成这项工作。