そもそも外部キー制約が取り入れられたのがVer3.6.19からです。
2009-10-14リリースからですね。
https://www.sqlite.org/oldnews.html
せっかくなので確認してみます。
まずは、デフォルトでの動作確認です。
従業員テーブルと、部署テーブルを定義してから
部署テーブルにデータをいれずに、従業員テーブルにデータを
入れて外部参照エラーを起こさせるシナリオです。
using System;
using System.Data;
using System.Data.SQLite;
namespace SampleCode
{
class Program
{
static void Main(string[] args)
{
try
{
using (SQLiteConnection con = new SQLiteConnection("Data Source=:memory:"))
{
con.Open();
using (SQLiteCommand cmd = con.CreateCommand())
{
// 部署テーブルの作成
cmd.CommandText = "CREATE TABLE [Department](" +
"[id] INTEGER NOT NULL PRIMARY KEY, " +
"[name] TEXT NOT NULL" +
");";
cmd.ExecuteNonQuery();
// 従業員テーブルの作成
cmd.CommandText = "CREATE TABLE [Employee](" +
"[id] INTEGER PRIMARY KEY AUTOINCREMENT, " +
"[name] TEXT NOT NULL, " +
"[depID] INTEGER NOT NULL," +
"FOREIGN KEY([id]) REFERENCES [Employee]([depID]) " +
");";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO [Employee] (name, depID) VALUES('hoge', 100);";
cmd.ExecuteNonQuery();
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}何事もなく終了します。
そこで、Foreign Keyプラグマを有効にします。
https://www.sqlite.org/pragma.html#pragma_foreign_keys
下記のように、SQL文として実行することでも有効にできますが・・・
cmd.CommandText = "PRAGMA foreign_keys = ON;";
cmd.ExecuteNonQuery();
接続文字列に指定することもできます。
[SQLite]DB作成および接続
SQLiteConnection con = new SQLiteConnection("Data Source=:memory:;Foreign Keys=True")
これで実行すると、下記のようにエラーになります
SQL logic error or missing database foreign key mismatch - "Employee" referencing "Employee"




