sqliteでいずれかがnullになる可能性がある場合、複数の列に一意の制約を設定するにはどうすればよいですか?
たとえば、unique("col1","col2","col3") を作成し、insert into tablename values("abc","def",null)
2 回試してみると、両方の行が挿入されました。3 番目の列が null の場合、一意の制約は機能しません。
sqliteでいずれかがnullになる可能性がある場合、複数の列に一意の制約を設定するにはどうすればよいですか?
たとえば、unique("col1","col2","col3") を作成し、insert into tablename values("abc","def",null)
2 回試してみると、両方の行が挿入されました。3 番目の列が null の場合、一意の制約は機能しません。
sqlite では、すべての null が違いです。この問題を解決する最善の方法は、列 c を特別なデフォルト値で null 以外に設定することだと思います。次に、デフォルト値 (0、'' など) を使用して null を表します。
このソリューションを任意の列に簡単に拡張できます
create table test (
a text not null default "",
b text not null default "",
c text not null default ""
);
バージョン 3.9.0 (2015-10-14) 以降では、式 ( https://www.sqlite.org/expridx.html ) でインデックスを使用し、たとえばCOALESCE
関数を使用してnull
値を何らかの形式のフォールバック値に変換できます。
CREATE UNIQUE INDEX IX_Unique ON Table1 (
COALESCE(col1, ""),
COALESCE(col2, ""),
COALESCE(col3, "")
);