nullを許可する列がテーブルにありますが、nullまたは一意にする制約を作成したいのですが...どうすればよいですか?
注:フロントエンドから検証しますが、この開発者でもデータを入力できるように、SQLサーバーに物理的なものが必要です
3 に答える
SQL Server 2000以降で機能するフィルター処理されたインデックスの代わりに、インデックス付きビューがあります。
何かのようなもの:
CREATE VIEW DRI_YourTable_NonNullUnique
WITH SCHEMABINDING
AS
SELECT YourColumn FROM dbo.YourTable WHERE not YourColumn is NULL
GO
CREATE UNIQUE CLUSTERED INDEX IX_DRI_YourTable on DRI_YourTable_NonNullUnique (YourColumn)
このビューが作成されたら、特別なことをする必要はないことに注意してください。再度参照する必要はありません。ベーステーブルに一意でない値を挿入しようとすると、制約違反が発生するだけです。
@marc_s-私は違うように頼みます。Enterpriseより前のエディションでは、(クエリのコンパイルで)自動的に考慮されることはありませんが、確実に作成可能であり、すべてのエディションでDRIエンフォーサーとして機能します。
select @@VERSION
create table dbo.T1 (
T1ID int IDENTITY(1,1) not null,
Val1 varchar(10) null,
constraint PK_T1 PRIMARY KEY (T1ID)
)
go
create view dbo.DRI_T1_Val1Unique
with schemabinding
as
select Val1 from dbo.T1 where Val1 is not null
go
create unique clustered index IX_DRI_T1_Val1Unique on dbo.DRI_T1_Val1Unique (Val1)
go
insert into dbo.T1 (Val1)
select 'abc' union all
select null union all
select null
go
insert into dbo.T1 (Val1)
select 'abc'
go
select * from dbo.T1
結果:
Microsoft SQL Server 2000 - 8.00.2039 (Intel X86) May 3 2005 23:18:38 Copyright (c) 1988-2003 Microsoft Corporation Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
1 abc
2 NULL
3 NULL
と:
(1 row(s) affected)
(3 row(s) affected)
Msg 2601, Level 14, State 3, Line 1
Cannot insert duplicate key row in object 'DRI_T1_Val1Unique' with unique index 'IX_DRI_T1_Val1Unique'.
The statement has been terminated.
(0 row(s) affected)
(3 row(s) affected)
残念ながら、SQLServer2005ではこれを行うことはできません。一意のインデックスでは、NULL値の1行のみが許可されます。
SQL Server 2008では、フィルター処理されたインデックスを使用できます。これは、行の一部(たとえば、NULL以外の行)でのみ定義されるインデックスです。これは2008年の機能であるため、2005年にはこれを行うことができなくなります。
CREATE UNIQUE NONCLUSTERED INDEX IX_UNIQUE
ON dbo.YourTable(YourColumn)
WHERE YourColumn IS NOT NULL
GO
見る:
その列の通常の一意性制約を介してnull許容列を一意にすることはできませんが、関数ベースのインデックスを介して制約を実装することはできます。そのような構造がSQLサーバーに存在するかどうかはわかりませんが、Oracleでは解決される可能性があります。データベース