2013-06-11 7 views
5

Ich habe eine sqlite Tisch (sqlite Version 3.7.3), wo Nullen in die Primärschlüsselspalte eingeführt werden in unerwünschter Weise automatisch inkrementiert:verhindern autoinkrementierenden ganzzahligen Primärschlüssel?

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

Im sqlite docs, es zeigt, dass die Zugabe von AUTOINCREMENT Schlüsselwort an die Säule soll dieses Verhalten erstellen, aber es scheint kein Schlüsselwort verhindert die automatische Inkrementierung zu sein ...

ich fand auch, dass ich sQLite mit den SQLITE_OMIT_AUTOINCREMENTcompile option, bauen kann, aber ich will nicht deaktivieren das Verhalten global, nur für diese spezielle Spalte.

Interessanterweise, wenn ich die PRIMARY KEY Einschränkung nicht enthalten, erhalte ich das gewünschte Verhalten:

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

Wie kann ich die Tabelle definieren, so dass NULL-Werte werden verworfen und halten die Primärschlüsselbedingung?

Antwort

6

Autoincrement Verhalten gilt nur für Spalten, die als INTEGER PRIMARY KEY deklariert sind. So sind die einfachsten Möglichkeiten, um sie zu deaktivieren sind:

  • Deklarieren Sie die Spalte als UNIQUE statt PRIMARY KEY.
  • Deklarieren Sie den Spaltentyp als INT anstelle von INTEGER.

Beachten Sie, dass entweder geben Sie eine Spalte mit ganzzahligen Affinität statt gezwungen zu werden, nur ganze Zahlen zu enthalten.

+0

wow, genau dort in der Dokumentation ...: D –

+1

Sie möchten wahrscheinlich auch die UNIQUE mit NOT NULL kombinieren, um die Erstellung von "idless" Datensätzen in Ihrer Tabelle zu verhindern. – Timo

-2

Eine Möglichkeit Autoinkrement (außerhalb der Neuerstellung der Tabelle) zu deaktivieren, wenn Sie Daten einfügen müssen, ist das Import-Tool in sqlite3 zu verwenden:

Wenn Sie eine Tabelle wie folgt aus:

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

wenn Sie den Importbefehl auf ihn mit Ihren Daten-Datei ausführen:

ID col1 
10 abc 
20 def 

import myfile.txt table1 

es werden die Zeilen importieren, und es wird die Autoinkrement Funktion außer Acht lassen.

+0

Funktioniert bei mir zumindest nicht. Getestet mit 'sqlite3 - Version 3.8.10.2 2015-05-20 18:17:19 2ef4f3a5b1d1d0c4338f8243d40a2452cc1f7fe4' – Timo

Verwandte Themen