2016年2月1日月曜日

[SQLite]Unique制約で大文字小文字を同じ物と判定する方法

例えば、このブログのタグもそうですが、SQLiteもSQLITEもsqliteも一つのものとして判断してほしい場合があると思います。

そこでUniqueキー制約をつけてみると・・・
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 [Blog](" +
                                          "[tag]  TEXT    NOT NULL, " +
                                          "UNIQUE([tag])" +
                                          ");";
                        cmd.ExecuteNonQuery();

                        cmd.CommandText = "INSERT INTO [Blog] ([tag]) VALUES('SQLite');";
                        cmd.ExecuteNonQuery();

                        cmd.CommandText = "INSERT INTO [Blog] ([tag]) VALUES('SQLITE');";
                        cmd.ExecuteNonQuery();
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}
問題なく入ります。
大文字と小文字を別物として判断しているからです。

そこで、大文字小文字を区別してほしくない列にCOLLATE NOCASEをつけてみます。
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 [Blog](" +
                                          "[tag]  TEXT    NOT NULL, " +
                                          "UNIQUE([tag] COLLATE NOCASE)" +
                                          ");";
                        cmd.ExecuteNonQuery();

                        cmd.CommandText = "INSERT INTO [Blog] ([tag]) VALUES('SQLite');";
                        cmd.ExecuteNonQuery();

                        cmd.CommandText = "INSERT INTO [Blog] ([tag]) VALUES('SQLITE');";
                        cmd.ExecuteNonQuery();
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

エラーがでるようになりました。
constraint failed
UNIQUE constraint failed: Blog.tag


もちろん、PRIMARY KEYであっても同じことです。
cmd.CommandText = "CREATE TABLE [Blog](" +
                                        "[tag]  TEXT , " +
                                        "PRIMARY KEY([tag] COLLATE NOCASE)" +
                                        ");";

uniqueじゃないと怒ってくれます。
constraint failed
UNIQUE constraint failed: Blog.tag

0 件のコメント:

コメントを投稿