2016-10-02 75 views
2

在Sqlite中,有兩種方法可以通過默認的ROWID機制或通過AUTOINCREMENT機制創建由數據庫引擎生成的單調遞增的主鍵值。在什麼情況下應該使用AUTOINCREMENT而不是默認的ROW ID?

sqlite> -- Through the default ROWID mechanism 
sqlite> CREATE TABLE foo(id INTEGER NOT NULL PRIMARY KEY, foo); 
sqlite> INSERT INTO foo (foo) VALUES ('foo'); 
sqlite> INSERT INTO foo (foo) VALUES ('bar'); 
sqlite> SELECT * FROM foo; 
1|foo 
2|bar 
sqlite> 
sqlite> -- Through the AUTOINCREMENT mechanism 
sqlite> CREATE TABLE bar(id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, bar); 
sqlite> INSERT INTO bar (bar) VALUES ('foo'); 
sqlite> INSERT INTO bar (bar) VALUES ('bar'); 
sqlite> SELECT * FROM bar; 
1|foo 
2|bar 
sqlite> -- Only the AUTOINCREMENT mechanism uses the sqlite_sequence table 
sqlite> SELECT * FROM sqlite_sequence WHERE name in ('foo', 'bar'); 
bar|2 

documentation似乎表明,使用AUTOINCREMENT不好:

AUTOINCREMENT關鍵字強加額外的CPU,內存,磁盤空間和磁盤I/O開銷,應避免使用,如果不嚴格要求。通常不需要。

如果AUTOINCREMENT關鍵字出現在INTEGER PRIMARY KEY之後,則會更改自動ROWID分配算法,以防止在數據庫的整個生命週期中重複使用ROWID。換句話說,AUTOINCREMENT的目的是防止重複使用以前刪除的行中的ROWID。

[附AUTOINCREMENT,] SQLite的跟蹤,每當創建包含自動增量列普通表的表曾經使用名爲「sqlite_sequence」 .The sqlite_sequence表創建一個內部表中保存和自動初始化最大的ROWID 。可以使用普通的UPDATE,INSERT和DELETE語句修改sqlite_sequence表的內容。但是對該表進行修改可能會干擾AUTOINCREMENT密鑰生成算法。在進行這樣的改變之前,確保你知道你在做什麼。


在什麼情況下是適合使用AUTOINCREMENT關鍵字?

回答

2

文檔說

AUTOINCREMENT的目的是爲了防止的ROWID的重用以前刪除的行。

因此,當您需要防止重複使用先前刪除的行中的ROWID時,使用AUTOINCREMENT關鍵字是適當的。如果您有對這些已刪除行的外部引用,則可能需要這樣做,並且不得將它們與新行混淆。

+0

假設您啓用了外鍵,不可能對已刪除的行進行外部引用。假設你禁用了外鍵,那麼你是否有一個用例來保留對被刪除行的外部引用是一個好主意? –

+0

這裏,「外部」是指數據庫外部。 –

+0

對不起,我還是不明白:)。何時對外部數據庫保留對已刪除標識的引用有用? –

相關問題