2015-06-10 82 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代碼,但應導致更少的自動遞增的差距。