DB/SQLite

C# SQLite 외래키 제약 조건 활성화 방법

푸코잇 2024. 4. 1. 11:09
728x90

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;을 추가해주면 된다.