C#에서 SQLite를 사용하던 중 외래키를 사용하게 되었다.
참조무결성 제약인 ON DELETE CASCADE, ON UPDATE CASCADE를 적용하기 위해서는 외래키 제약 조건을 활성화해야 한다.
SQLite 버전 3.6.19부터 외래키 제약 조건의 기본 설정은 OFF 되어 있다.
C#에서 SQLite 외래키 제약 조건 활성화 방법에 대해 알아보자.
class Program
{
private const string _connInfo = @"Data Source=TestDB.db";
public static void ExecuteNonQuery(string query)
{
using (SQLiteConnection conn = new SQLiteConnection(_connInfo))
{
try
{
conn.Open();
using (SQLiteCommand command = new SQLiteCommand(query, conn))
{
command.ExecuteNonQuery();
}
}
catch (Exception e)
{
Console.WriteLine($"DB 연결 예외({e.Message})");
}
}
}
static void Main(string[] args)
{
string deleteQuery = $"PRAGMA foreign_keys = ON; DELETE FROM TEST;";
ExecuteNonQuery(deleteQuery);
}
}
쿼리문에 PRAGMA foreign_keys = ON;을 통해 외래키 제약 조건을 활성화할 수 있다.
하지만 PRAGMA는 트랜잭션 내에서 작동하지 않는 단점이 있다.
만약, 트랜잭션에도 외래키 제약 조건을 활성화하고 싶다면 아래와 같이 설정하자.
class Program
{
private const string _connInfo = @"Data Source=TestDB.db;foreign keys=true;";
public static void ExecuteNonQuery(string query)
{
using (SQLiteConnection conn = new SQLiteConnection(_connInfo))
{
try
{
conn.Open();
using (var transaction = conn.BeginTransaction())
{
try
{
using (SQLiteCommand command = new SQLiteCommand(query, conn))
{
command.ExecuteNonQuery();
}
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
Console.WriteLine($"트랜잭션 에러{ex.Message}");
}
}
}
catch (Exception e)
{
Console.WriteLine($"DB 연결 예외({e.Message})");
}
}
}
static void Main(string[] args)
{
string deleteQuery = $"PRAGMA foreign_keys = ON; DELETE FROM TEST;";
ExecuteNonQuery(deleteQuery);
}
}
SQLiteConnection을 생성할 때 connectionString에 foreign keys=true;을 추가해주면 된다.