SQLiteでテーブルを作成する場合、各列に制約を追加するオプションがあります。
そのような制約の1つは、DEFAULT
です。 制約。
DEFAULT
制約を使用すると、新しい行が挿入されたときにその列に値が指定されなかった場合に使用する値を指定できます。
しない DEFAULT
を使用する 句の場合、列のデフォルト値はNULL
です。 。
可能なデフォルト値
DEFAULT
の明示的なデフォルト値 制約は次のいずれかになります。
- 文字列定数
- ブロブ定数
- 符号付き数値
- 括弧で囲まれた定数式。
-
CURRENT_TIME
-
CURRENT_DATE
-
CURRENT_TIMESTAMP
-
NULL
例
実例を示します。
CREATE TABLE Products(
ProductId INTEGER PRIMARY KEY,
ProductName,
Price DEFAULT 0.00
);
ここにDEFAULT
を追加しました 価格への制約 桁。この場合、デフォルト値は 0.00です。 。
価格の値を指定せずに新しい行を挿入すると、 列では、デフォルト値が使用されます。
INSERT INTO Products ( ProductId, ProductName )
VALUES (1, 'Long Weight');
SELECT * FROM Products;
結果:
ProductId ProductName Price ---------- ----------- ---------- 1 Long Weight 0.0
明示的な値
もちろん、デフォルト値は、明示的に値を指定しない場合にのみ使用されます。その場合、代わりにその値が使用されます。
別の例を示します。今回は、その価格の値を明示的に提供します 桁。
INSERT INTO Products ( ProductId, ProductName, Price )
VALUES (2, 'Left-Handed Screwdriver', 19.99);
SELECT * FROM Products;
結果:
ProductId ProductName Price ---------- ------------------------- ---------- 1 Long Weight 0.0 2 Left-Handed Screwdriver 19.99
明示的なNULL
前の例は、明示的に指定されたNULL
にも適用されます 値。
これを示すために、NULL
を明示的に挿入するとどうなりますか。 価格に 列。
INSERT INTO Products ( ProductId, ProductName, Price )
VALUES (3, 'Elbow Grease', NULL);
SELECT * FROM Products;
結果:
ProductId ProductName Price ---------- ------------------------ ---------- 1 Long Weight 0.0 2 Left-Handed Screwdriver 19.99 3 Elbow Grease
今回は価格 列はNULL
です 、それは私がその列に明示的に挿入したものだからです。
これを防ぐには、SQLiteにデータを挿入するときにNULL値を列のデフォルト値に変換する方法を参照してください。
デフォルトのタイムスタンプ
この例では、別のテーブルを作成します。今回はデフォルト値を現在のタイムスタンプに設定しました。
CREATE TABLE Types(
TypeId INTEGER PRIMARY KEY,
Type,
DateInserted DEFAULT CURRENT_TIMESTAMP
);
そして今、いくつかのデータについて。
INSERT INTO Types (Type)
VALUES ( 'Hardware' );
SELECT * FROM Types;
結果:
TypeId Type DateInserted ---------- ---------- ------------------- 1 Hardware 2020-06-05 00:21:57
タイムスタンプは期待どおりに挿入されます。
デフォルト値としての値の自動インクリメント
前の例では、 TypeIdの値も指定しなかったことに注意してください 列ですが、とにかくデフォルト値が自動的に生成されました。
この場合、デフォルト値はDEFAULT
によるものではありませんでした 制約。これは、列がINTEGER PRIMARY KEY
を使用して作成された主キー列であるという事実によるものです。 。 INTEGER PRIMARY KEY
を使用して列を定義する場合 、列は自動的に自動インクリメント列になります。
これをより完全に示すために、さらに行を挿入するとどうなりますか。
INSERT INTO Types (Type)
VALUES
( 'Software' ),
( 'Hardcopy' );
SELECT * FROM Types;
結果:
TypeId Type DateInserted ---------- ---------- ------------------- 1 Hardware 2020-06-05 00:21:57 2 Software 2020-06-05 00:22:14 3 Hardcopy 2020-06-05 00:22:14
自動インクリメント列の詳細については、「SQLiteでAUTOINCREMENTがどのように機能するか」および「SQLiteで自動インクリメント列を作成する方法」を参照してください。
デフォルト値としての式
デフォルト値として定数式を使用することもできます。これを行うには、式を括弧で囲む必要があります。
これが例です。
CREATE TABLE Person(
PersonId INTEGER PRIMARY KEY,
Name,
Entered DEFAULT (round(julianday('now'))),
Deadline DEFAULT (round(julianday('now')) + 10.5)
);
そして今、いくつかのデータについて。
INSERT INTO Person (Name)
VALUES ( 'Fred' );
SELECT * FROM Person;
結果:
PersonId Name Entered Deadline ---------- ---------- ---------- ---------- 1 Fred 2459006.0 2459016.5
式は定数式でなければならないことに注意してください。定数式は、定数のみを含む式です。
定数のみを含まない式を使用しようとすると、エラーが発生します。
CREATE TABLE Person(
PersonId INTEGER PRIMARY KEY,
FirstName,
LastName,
UserName DEFAULT (FirstName || LastName)
);
結果:
Error: default value of column [UserName] is not constant