条件に該当するデータが存在しない時だけ登録するSQL

条件に該当するデータが存在しない時だけ登録するSQL

insert into [テーブル名] (フィールド名)
select 登録する値
where NOT EXISTS (select 1 from [テーブル名] where 条件)

例1:テーブル「tbl1」のフィールド「f1」に「テストデータ」がなければ、「テストデータ」を登録する

insert into tbl1 (f1)
select 'テストデータ'
where NOT EXISTS (select 1 from tbl1 where f1='テストデータ')

例2:テーブル「tbl1」のフィールド「f1」に「テストデータ」がなければ、フィールド「f2」に「ダミーデータ」を登録する

insert into tbl1 (f2)
select 'ダミーデータ'
where NOT EXISTS (select 1 from tbl1 where f1='テストデータ')

FireDACでSQLiteの日付型を扱うには

SQLiteデータベースには日付型がありません。
FireDACには日付をうまく扱う仕組みが用意されています。

日付型のデータ表現を設定する

FireDAC接続エディタで日付型をどのようにデータベースに登録するかを設定できます。

「定義」タブの「DateTimeFormat」で「String」「Binary」「DateTime」から日付型の扱い方を選択します。

FDConnection00

DateTimeFormatが「String」のとき

DateTimeFormatを「String」にすると、’yyyy-mm-dd hh24:mi:ss’ 形式の文字列としてデータベースに格納されます。

可読性の高い格納方法です。

例:DateTimeFormatを「String」にして次のコードを実行します。

FDQuery1.SQL.Text := 'insert into TBL1(DAY) values(:DAY)';
FDQuery1.ParamByName('DAY').AsDateTime := Now;
FDQuery1.ExecSQL;

次の値が保存されました。

2015-02-28 19:56:07.106

DateTimeFormatが「Binary」のとき

DateTimeFormatを「Binary」にすると、ユリウス日を表す実数として格納します。

例:DateTimeFormatを「Binary」にして次のコードを実行します。

FDQuery1.SQL.Text := 'insert into TBL2(DAY) values(:DAY)';
FDQuery1.ParamByName('DAY').AsDateTime := Now;
FDQuery1.ExecSQL;

次の値が保存されました。

42063.832531875

DateTimeFormatが「DateTime」のとき

DateTimeFormatを「DateTime」にすると、TDateTime 値を表す実数として格納します。

例:DateTimeFormatを「DateTime」にして次のコードを実行します。

FDQuery1.SQL.Text := 'insert into TBL3(DAY) values(:DAY)';
FDQuery1.ParamByName('DAY').AsDateTime := Now;
FDQuery1.ExecSQL;

次の値が保存されました。

2457082.33325122

FireDACでSQLiteデータベースのAUTOINCREMENT列に登録された取得するには

SQLiteデータベースのAUTOINCREMENT列に登録された値は、SQLiteのlast_insert_rowid関数を使って取得できます。
しかし、last_insert_rowid関数を使うとプログラムはSQLiteに密に結合してしまいます。

FireDACでは、TFDConnectionにあるGetLastAutoGenValueメソッドを使って、SQLiteデータベースのAUTOINCREMENT列に登録された取得することができます。

サンプルコードです。

// sqlite3.dllのパス
FDPhysSQLiteDriverLink1.VendorLib := 'C:\driver\sqlite3.dll';
// データベースに接続する
FDConnection1.Params.Clear;
FDConnection1.Params.Add('DriverID=SQLite');
FDConnection1.Params.Add('Database=:memory:');
FDConnection1.Connected := True;
/ /テーブルを作成する
FDConnection1.ExecSQL('CREATE TABLE TBL1(ID INTEGER PRIMARY KEY AUTOINCREMENT, F1 TEXT, F2 TEXT)');

// 行を追加する
FDQuery1.SQL.Text := 'insert into TBL1(F1, F2) values (:F1, :F2)';
FDQuery1.ParamByName('F1').AsString := 'Delphi';
FDQuery1.ParamByName('F2').AsString := 'Object Pascal';
FDQuery1.ExecSQL;

// AUTOINCREMENT列に登録された値を取得する
ShowMessage(FDConnection1.GetLastAutoGenValue('TBL1'));

SQLiteで複数の行を1行のINSERT文でまとめて追加する

SQLite(バージョン 3.7.11以降)では、次のようにして複数のデータを1行のINSERT文でまとめてINSERT文で追加することができます。

insert into t1 (f1, f2, f3)
values ('a1', 'b1', 'c1'),
       ('a2', 'b2', 'c2'),
       ('a3', 'b3', 'c3')

サーチエンジンで検索すると、古いバージョンを元に書かれた記事がありますが、現在のバージョンでは上のようにして一括して登録することができます。