我有一個表中的列允許爲空,但我想使約束,使他爲空或獨特的...我該怎麼做?
注意:我從前端驗證它,但我想有一個物理的SQL服務器,允許這甚至開發人員嘗試輸入數據如何讓允許null的Column在SQL Server 2005中是唯一的?
1
A
回答
1
到SQL Server 2000上的作品,後來篩選的索引的替代方案是一個indexed view.
喜歡的東西:
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)
1
不幸的是,你不能在SQL Server 2005中做到這一點。唯一索引只允許一行NULL值。
使用SQL Server 2008,您可以使用已過濾索引 - 僅在部分行上定義的索引,例如,那些不是空的。這是一個2008年的功能,所以你將不能夠做到這一點在2005年
CREATE UNIQUE NONCLUSTERED INDEX IX_UNIQUE
ON dbo.YourTable(YourColumn)
WHERE YourColumn IS NOT NULL
GO
參見:
0
你不能讓一個可空列通過該列上的常規唯一約束唯一,但是您可以通過基於函數的索引實現該約束,不知道這樣的構造是否存在於sql服務器b上UT可能解決它在Oracle數據庫上
相關問題
- 1. 如何在sql server 2008中的表的所有列中允許null?
- 2. 如何在SQL Server 2005中設置唯一鍵。
- 3. 如何在SQL Server 2005中創建複合唯一約束
- 4. 允許重複的SQL Server唯一索引
- 5. 如何允許在該領域具有唯一約束在SQL Server
- 6. <column> IS NULL vs <column> =在LINQ to SQL生成SQL中的NULL
- 7. 使用SQL Server 2005,允許做一個存儲過程分頁
- 8. 如何在sql server 2005/8中創建沒有聚合函數的Column to Row?
- 9. SQL Server Reporting Services 2005許可
- 10. 如何在MySQL中允許NULL值
- 11. 實現唯一約束的正確方法,允許SQL Server中有多個NULL值
- 12. 爲什麼T-SQL允許null和 'NULL'
- 13. SQL Server 2005如何創建唯一約束?
- 14. 在SQL Server中允許審批狀態
- 15. mysql不允許在唯一索引處爲NULL
- 16. 如何在SQL Server 2005/2008
- 17. 如何讓dbmail處理SQL Server 2005隊列中的項目?
- 18. 當連接到SQL Server 2005時,SQL Server不允許遠程連接
- 19. 在SQL Server 2005中
- 20. 如何獲取唯一的全無證存儲特效在SQL Server 2005
- 21. 的SQL Server 2005:ALTER COLUMN AUTO_INCREMENT和集開始ID AUTO_INCREMENT
- 22. Doctrine2,壞語法唯一索引,SQL Server 2005中
- 23. SQL Server 2008允許遠程連接嗎?
- 24. 如何比較SQL Server 2005中的DTS
- 25. @Column(S)不允許在@ManyToOne屬性
- 26. 我可以讓SQL Server 2005 Table Column只接受字母和數字嗎?
- 27. SQL Server 2005中的內置數據庫角色允許執行存儲過程?
- 28. 在SQL Server 2005
- 29. 在SQL Server 2005
- 30. 在SQL Server 2005
但索引視圖僅在企業版本中可用 - 在Express,Workgroup或Standard版本中無法使用:-( – 2010-09-28 06:49:05