2017-03-02 4 views
0

Die folgenden Codezeilen veranschaulichen die Erstellung der Tabelle und wobei die Altersspalte mit dem Datentyp INTEGER erstellt wird, aber trotzdem TEXT eingefügt werden kann.SQLite Spalteneinschränkung: Nur Integer

sqlite> .open dummy.db 
sqlite> CREATE TABLE dummy1 (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER); 
sqlite> INSERT INTO dummy1(name, age) VALUES ("varma", 40); 
sqlite> INSERT INTO dummy1(name, age) VALUES ("sandy", sixty); 
Error: no such column: sixty 
sqlite> INSERT INTO dummy1(name, age) VALUES ("sandy", "sixty"); 
sqlite> SELECT * FROM dummy1; 
1|varma|40 
2|sandy|sixty 

ich versuchte Schaffung Tabelle mit Spalten Einschränkung als: "age INTEGER"

Attempt to Einschränkung fehlgeschlagen.

Antwort

2

SQLite verwendet dynamic typing; Wenn Sie Spaltentypen erzwingen wollen, müssen Sie eine explizite Integritätsregel verwenden:

CREATE TABLE dummy1 (
    ..., 
    age INTEGER CHECK (typeof(age) = 'integer') 
); 
1

Dies ist in SQLite erlaubt, weil SQLite "dynamic type system" hat, was bedeutet, dass der Datentyp dem zugeordnet ist, was gespeichert ist, anstatt dem, was in der Tabellendefinition definiert ist. Alles wird intern als TEXT gespeichert.

Von https://www.sqlite.org/datatype3.html:

SQLite verwendet ein allgemeinere dynamisches Typsystem. In SQLite ist der Datentyp eines Werts mit dem Wert selbst verknüpft, nicht mit seinem Container. Das dynamische Typsystem von SQLite ist rückwärtskompatibel mit den üblicheren statischen Systemtypen anderer Datenbank-Engines in der Sinn, dass SQL-Anweisungen, die auf statisch typisierten Datenbanken arbeiten, in SQLite genauso funktionieren sollten. Die dynamische Eingabe in SQLite ermöglicht es jedoch, Dinge zu tun, die in herkömmlichen starr typisierten Datenbanken nicht möglich sind.

Dies ist in anderen RDBMS wie Oracle, SQL Server usw. nicht zulässig, wenn Daten dem Typ der Spalte entsprechen müssen.

+0

Wenn alles als TEXT gespeichert wird. Macht es die Datenbankgröße nicht mehr? – Varma