INSERT IGNORE上的PRIMARY KEY自动递增

时间:2015-06-10 04:36:11

标签: php mysql sql sql-insert

这是一个完整的插入内容:http://codebin.org/view/61969a27

以下是该插入内容的一个示例:

INSERT IGNORE INTO `listings`
(
    `feed_id` ,
     `source` ,
    `time` ,
    `country`,
    `state` ,
    `city` ,
    `zip`,
    `title` ,
    `url`
)
VALUES (
     '5050498326',
     'cl_web',
     '1433027144',
     'US',
     'AL',
     'Auburn',
     '36830',
     'Moms Helping Moms Work From Home!',
     'http://auburn.craigslist.org/web/5050498326.html'
 ), (
     '5050537388',
     'cl_web',
     '1433026553',
     'US',
     'AL',
     'Auburn',
     '36830',
     'Moms Helping Moms Work From Home!',
     'http://auburn.craigslist.org/web/5050537388.html'
);

我发现,auto_increment在失败的情况下正在增加'插入,或者更确切地说是被忽略的插入。

我有一个值列表和很多时间(大部分时间)我已经拥有数据库中的那些。

是否有另一种方法来编写此查询,以便auto_increment不会增加?此外,有没有更好的更优化的方式来编写这种查询?我知道你可以对选择进行插入,但我对SQL并不熟悉。

1 个答案:

答案 0 :(得分:0)

想象一下,有两个交易。第一个事务在请求新的自动增量值后中止。由于第二个交易必须收到更高的自动增量编号,并且第一个交易没有使用其指定的编号,因此现在存在差距。理论上不可能保证无间隙自动增量列。

您可以使用where子句来过滤掉密钥违规,从而缩小差距。例如,如果未采用PK,此查询仅插入一行:

insert  Table1
        (pk, col1)
select  1
,       'val1'
where   not exists
        (
        select  *
        from    Table1
        where   pk = 1
        )

这需要比insert ignore更多的SQL代码,但应该导致更少的自动增量间隙。