sql >> データベース >  >> RDS >> SQLite

SQLiteの列のデフォルト値を設定します:DEFAULT Constraint

    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

    1. --skip-grant-tablesでMySQLを起動する方法は?

    2. MariaDB LAST_INSERT_ID()の説明

    3. PythonでMySQLデータベースに接続するにはどうすればよいですか?

    4. テーブルAPIとトランザクションAPIの違いを理解する