程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> SQL Server若何包管可空字段中非空值獨一

SQL Server若何包管可空字段中非空值獨一

編輯:MSSQL

SQL Server若何包管可空字段中非空值獨一。本站提示廣大學習愛好者:(SQL Server若何包管可空字段中非空值獨一)文章只能為提供參考,不一定能成為您想要的結果。以下是SQL Server若何包管可空字段中非空值獨一正文


表構造以下面代碼創立


CREATE TABLE test_tb
(
TestId int not null identity(1,1) primary key,
Caption nvarchar(100) null
);
GO

處理計劃1:
關於這個成績,年夜家的第一個設法主意能夠是:在Caption這個字段下面加一個獨一鍵不便可以了嗎?好,我們按著這個思緒做下去,先創立獨一索引。

CREATE UNIQUE NONCLUSTERED INDEX un_test_tb
ON test_tb(Caption)
GO

索引創立好了,我們來測試下後果

INSERT INTO test_tb (Caption)
VALUES (null)
GO
INSERT INTO test_tb (Caption)
VALUES (null)
GO

運轉以後我們會收到上面的毛病信息:
以下為援用的內容:
新聞 2601,級別 14,狀況 1,第 1 行
不克不及在具有獨一索引 'un_test_tb' 的對象 'dbo.test_tb' 中拔出反復鍵的行。
語句已終止。

所以該處理計劃是不可的。
處理計劃2:
添加束縛,讓SQL Server在拔出數據的時刻,先驗證下已稀有據中能否有如今要拔出的這個值。因為這個束縛不是簡略的一個運算,是以我們先創立一個函數,然後再在束縛中挪用這個函數。
創立驗證邏輯函數:

CREATE FUNCTION [dbo].[fn_CK_test_tb_Caption]()
RETURNS BIT
AS
BEGIN
IF(EXISTS(
SELECT 1
FROM test_tb AS a
WHERE (Caption IS NOT NULL) AND EXISTS
(SELECT 1 AS Expr1
FROM test_tb
WHERE (Caption IS NOT NULL) AND (Caption = a.Caption) AND (a.TestId <> TestId))
))
RETURN 0
RETURN 1
END
GO

在束縛中援用函數:

ALTER TABLE test_tb
ADD CONSTRAINT CK_test_tb_Caption CHECK (dbo.fn_CK_test_tb_Caption() = 1)
GO

如今來測試下後果。先來測試NULL值

INSERT INTO test_tb (Caption)
VALUES (null)
GO
INSERT INTO test_tb (Caption)
VALUES (null)
GO
SELECT * FROM test_tb
GO

可以勝利運轉,並且也出了多行動NULL的情形。如今再來測試不為空的拔出情形。

INSERT INTO test_tb (Caption)
VALUES (N'AAA')
GO
INSERT INTO test_tb (Caption)
VALUES (N'BBB')
GO
INSERT INTO test_tb (Caption)
VALUES (N'BBB')
GO
SELECT * FROM test_tb
GO

成果是在第三條語句的時刻報錯了,表中的Caption字段也有‘AAA'和‘BBB'了,這也正好是我們要的成果。
所以處理計劃2是准確的。然則為了這麼一個小小功效,就寫這麼長一段器械是否是太繁瑣了呢?我們來看上面的處理計劃。
處理計劃3:(只實用於SQL Server 2008)
SQL Server 2008中有了一個優雅的處理計劃,那就是挑選索引。挑選索引是一種經由優化的非集合索引,特別實用於涵蓋從界說完美的數據子集當選擇數據的查詢。挑選索引應用挑選謂詞對表中的部門行停止索引。有了挑選索引,我們只須要寫一條語句就到達下面的後果。

CREATE UNIQUE NONCLUSTERED INDEX un_test_tb
ON test_tb(Caption)
WHERE Caption is not null
GO

再用下面的一些測試語句來測試的話,會發明完整是到達了我們的請求。這個計劃的獨一缺陷就是該語句只要SQL Server 2008支撐。不曉得列位有無又優雅又實用於各個版本的SQL Server的處理計劃,望不堪賜教。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved