在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關鍵字?
假設您啓用了外鍵,不可能對已刪除的行進行外部引用。假設你禁用了外鍵,那麼你是否有一個用例來保留對被刪除行的外部引用是一個好主意? –
這裏,「外部」是指數據庫外部。 –
對不起,我還是不明白:)。何時對外部數據庫保留對已刪除標識的引用有用? –