0

SQL Server では、NULL に対する比較で NULL が返される残りの SQL のように、一意のインデックスが NULL を「単なる別の値」として扱うようです。

tnull 許容列に一意のインデックスを持つテーブル ( ) があるとしKます。

K     V
0     32
1     12
3     45

すべて良い。

しかし、それも許可します

K     V
0     32
1     12
3     45
NULL  89     <-- Baaad

逆に、次のことも可能になります。

K     V
NULL  89
0     32    <-- not good

NULL キー値を使用して、それ以上の内訳が不可能な値を表しているため、これは潜在的な災害になる可能性があることがわかります。合計と内訳があると、二重カウントまたは不一致が発生します。

人々が反対のことをしたい (複数の NULL を許可する) 質問が何千もあるように見えますが、NULL を NULL として扱いたいという質問はありません。


一意のインデックスでSQL Server が NULL を NULL として処理するようにするにはどうすればよいですか (そして、1 つの列で 1 つの NULLまたは任意の数の一意の値のみを許可します)。

4

2 に答える 2

1

あなたが望むものについての Andomar の解釈が正しければ、すべての可能な値をすでに含むテーブルがあればK、それは実行可能かもしれません:

create table dbo.T (
    K int null,
    V int not null,
)
go
create table dbo.PossibleKs (
    K int not null
)
insert into dbo.PossibleKs (K) values (0),(1),(2)
go
create view dbo.TV
with schemabinding
as
    select pk.K
    from
        dbo.T t
            inner join
        dbo.PossibleKs pk
            on
                t.K = pk.K or
                t.K is null
GO
create unique clustered index IX_TV on dbo.TV (K)

そしてあなたのテストケース:

insert into dbo.T(K,V) values
(0,     32),
(1,     12),
(3,     45)
go
insert into dbo.T(K,V) values
(NULL,89)
--Msg 2601, Level 14, State 1, Line 1
--Cannot insert duplicate key row in object 'dbo.TV' with unique index 'IX_TV'. The duplicate key value is (0).
--The statement has been terminated.
go
delete from dbo.T
go
insert into dbo.T(K,V) values
(NULL,89)
go
insert into dbo.T(K,V) values
(0,     32)
--Msg 2601, Level 14, State 1, Line 1
--Cannot insert duplicate key row in object 'dbo.TV' with unique index 'IX_TV'. The duplicate key value is (0).
--The statement has been terminated.
于 2013-05-01T06:54:55.033 に答える
0

したがって、1 つnullまたは任意の数の一意の番号が必要です。制約を使用して確実に強制できるとは思いません。

トリガーを使用する可能性があります。トリガーは、次のような質問に答える必要がありますnull。である行はすでにありnullますか? すでにあった行を更新していnullますか? そのトリガーは複雑で維持が困難です。

ストアド プロシージャを使用してテーブルを操作できます。ストアド プロシージャは、トランザクションで更新/挿入/削除操作を実行できます。コミットする前に、テーブルが 1 つnullまたは任意の数の他の値で構成されているかどうかを確認できます。あなたはそれを合理的に維持することができます。

結局のところ、設計は実装が困難な通常とは異なる制約を課します。もしかしたらデザインを見直すかもしれません。

于 2013-05-01T06:45:05.020 に答える