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

SQLiteに存在しない場合にのみテーブルを作成する方法

    SQLiteでは、IF NOT EXISTSを使用できます CREATE TABLEの句 作成する前に、同じ名前のテーブルまたはビューがデータベースにすでに存在するかどうかを確認するステートメント。

    この句を指定せずにテーブルを作成すると、同じ名前のテーブルがデータベースにすでに存在する場合、通常はエラーが発生します。ただし、IF NOT EXISTSを使用する場合 句、同じ名前のテーブルがすでに存在する場合、ステートメントは効果がありません。

    デモンストレーションの例を次に示します。

    CREATE TABLE IF NOT EXISTS t1 (
      c1 INT,
      c2 VARCHAR(10)
    );

    ここでは、t1 はテーブル名であり、括弧内はすべてテーブル定義(つまり、列など)です。

    その場合、テーブルはt1というテーブルまたはビューがまだない場合にのみ作成されます。 。

    テーブルが存在することを確認します

    sqlite_schemaにクエリを実行できます テーブルが現在存在するかどうかを確認するためのテーブル:

    SELECT EXISTS (
        SELECT 
            name
        FROM 
            sqlite_schema 
        WHERE 
            type='table' AND 
            name='t1'
        );

    結果:

    1

    この場合、1を取得します 、これはテーブルが存在することを意味します。

    テーブルをもう一度作成してみてください

    そのテーブルを再度作成しようとすると:

    CREATE TABLE IF NOT EXISTS t1 (
      c1 INT,
      c2 VARCHAR(10)
    );

    エラーは発生しません:

    sqlite> CREATE TABLE IF NOT EXISTS t1 (
      c1 INT,
      c2 VARCHAR(10)
    );
    sqlite> 

    何も得られません。

    IF NOT EXISTSなし 条項

    IF NOT EXISTSを使用しない場合は次のようになります すでに存在するテーブルを作成しようとするときの句:

    CREATE TABLE t1 (
      c1 INT,
      c2 VARCHAR(10)
    );

    今回はエラーが発生します:

    Error: table t1 already exists

    IF NOT EXISTSに注意してください 句はテーブルの構造/定義をチェックしません。作成しているテーブルに付けようとしているのと同じ名前の既存のテーブルまたはビューがないことを確認するだけです。

    言い換えれば、その名前のテーブルがすでに存在しているからといって、それが正しい定義を持っているという意味ではありません。

    また、IF NOT EXISTSであっても、既存のインデックスが原因でテーブルを作成できない場合は、エラーが返されます。 句が指定されています。


    1. MariaDBでのLTRIM()のしくみ

    2. PostgreSQL構成に関するチートシート

    3. mysql_real_escape_string()はSQLインジェクションから完全に保護しますか?

    4. Rails 3.1:時間範囲内のレコードのPostgresへのクエリ