2014-02-15 92 views
1

通常,當Sqlite遇到integer primary key語句時,例如「NOT NULL」防止rowid別名?

CREATE TABLE [T] (id INTEGER PRIMARY KEY, [...]); 

id列將是一個別名的rowid列,該列是SQLite的內部ID列。

然而,附加not null

CREATE TABLE [T] (Id INTEGER PRIMARY KEY NOT NULL, [...]); 

時走樣仍然激活?

NOT NULL應該不會影響表的語義特性,但對於混疊的規則是相當嚴格的(例如,它不會接受int,而不是integer),所以也許這細微的變化已經將防止混疊。

回答

3

按照documentation

如果一個rowid表具有由單個列和該列的聲明的類型是「INTEGER」在上和下殼體的任何混合物中的主鍵,然後該列成爲rowid的別名。

「NOT NULL」不是類型的一部分,但是是一個(多餘的)列約束,所以這仍然是rowid。

+0

我不熟悉Sqlite的細節 - 你確定「not null」不是_type_的一部分嗎?它是否像一個約束(在這種情況下是無用的)放在列上? – mafu

+0

這就是我所說的。這就是文檔所說的(參見'column-def')。 –