2017-03-02 20 views
0

次のコード行は、テーブルの作成を示し、age型の列はデータ型INTEGERで作成されますが、TEXTはまだ挿入できます。SQLite列の制限:整数のみ

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 

ように私は列制約とテーブルの作成を試してみました:制限に「年齢INTEGER」

失敗しました。

答えて

2

SQLiteはdynamic typingを使用します。列タイプを適用する場合は、明示的な制約を使用する必要があります。

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

これは、SQLiteには「動的型システム」があるため、これは許可されています。つまり、データ型はテーブル定義で定義されているものの代わりに格納されているものと関連付けられています。すべてが内部的にTEXTとして保存されています。 https://www.sqlite.org/datatype3.htmlから

SQLiteは、より一般的なダイナミック型システムを使用します。 SQLiteでは、値の データ型がその値そのものに関連付けられ、 コンテナには関連付けられません。 SQLiteの動的型システムは と、他のデータベースエンジンのより一般的な静的型システムとの後方互換性があります。 静的型付きデータベース で動作するSQL文はSQLiteで同じように動作するはずです。しかし、 の動的タイピングは、従来の の厳密に型指定されたデータベースでは不可能なことを可能にします。

これは、データが列のタイプと一致する必要があるOracle、SQL Serverなどの他のRDBMSでは許可されていません。

+0

すべてがTEXTとして保存されている場合。それはデータベースのサイズをより多くしませんか? – Varma

関連する問題