そこで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 件のコメント:
コメントを投稿