2013-06-11 18 views
5

Ho una tabella sqlite (sqlite versione 3.7.3) dove nulli inseriti nella colonna chiave primaria stanno essendo indesiderabilmente auto-incrementato:impedisce la chiave primaria intera autoincrementante?

sqlite> CREATE TABLE foo(bar INTEGER NOT NULL PRIMARY KEY); 
sqlite> INSERT INTO foo(bar) VALUES(NULL); 
sqlite> SELECT * FROM foo; 
1 

Nel sqlite docs, mostra che l'aggiunta della parola AUTOINCREMENT alla colonna dovrebbe creare questo comportamento, ma non sembra essere una parola chiave per prevenire l'incrementazione auto ...

ho anche scoperto che posso costruire SQLite con il SQLITE_OMIT_AUTOINCREMENTcompile option, ma io non voglio disabilitare il comportamento a livello globale, solo per questa particolare colonna.

È interessante notare che, se non si include il vincolo PRIMARY KEY, ottengo il comportamento desiderato:

sqlite> CREATE TABLE FOO(bar integer NOT NULL); 
sqlite> INSERT INTO FOO(bar) VALUES(NULL); 
SQL error: foo.bar may not be NULL 

Come posso definire la tabella in modo che i valori NULL sono rifiutati e mantenere il vincolo di chiave primaria?

risposta

6

Autoincrement comportamento si applica solo alle colonne dichiarate come INTEGER PRIMARY KEY. Così i modi più semplici per disattivarlo sono:

  • dichiarare la colonna come UNIQUE invece di PRIMARY KEY.
  • Dichiarare il tipo di colonna come INT anziché INTEGER.

noti che uno dei due vi darà una colonna con integer affinità invece di essere costretto a contenere solo numeri interi.

+0

wow, proprio lì nella documentazione ...: D –

+1

Probabilmente vuoi anche combinare UNIQUE con NOT NULL per impedire la creazione di record "idless" nella tua tabella. – Timo

-2

Un modo per disabilitare auto-incremento (al di fuori di ricreare la tabella) quando è necessario inserire i dati è quello di utilizzare lo strumento di importazione in sqlite3:

Se si dispone di una tabella come questa:

CREATE TABLE [table1] ([ID] integer PRIMARY KEY AUTOINCREMENT NOT NULL, [col1] TEXT); 

Se si esegue il comando di importazione su di esso con il file di dati:

ID col1 
10 abc 
20 def 

import myfile.txt table1 

sarà importare le righe, e non tiene conto della funzione di auto-incremento.

+0

Non funziona almeno per me. Testato con 'sqlite3 --version 3.8.10.2 2015-05-20 18:17:19 2ef4f3a5b1d1d0c4338f8243d40a2452cc1f7fe4' – Timo