例えば、このブログのタグもそうですが、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