2015-06-10 132 views
1

下面是一个完整插入:http://codebin.org/view/61969a27PRIMARY KEY自动递增,忽略

下面是插入的例子:

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不太熟悉。

任何帮助表示赞赏。谢谢。

+0

自动增量应该是非空和主键。即该值不能为空。您可以传递覆盖增量值的自动增量列值。您可以删除这些属性以免增加。有了这些属性,你不能。 –

+0

id(我没有通过)是auto_increment,非null和PRIMARY KEY。 feed_id和source也有一个UNIQUE INDEX。 – S16

+0

它是不可能忽略的人.. –

回答

0

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

您可以通过使用where子句过滤出关键违规来缩小差距。例如,下面的查询只插入一行,如果不采取PK:

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

这需要比insert ignore更多的SQL代码,但应导致更少的自动递增的差距。