Sql Server 自定義約束 實現:某列 可空,但非空值唯一不重複
案例:
1、準備表
create table student( --學生表
id int primary key identity(1,1), --自增主鍵
name nvarchar(255), --姓名
student_no varchar(255) --學號
)
2、 應用場景
一個學生表,學號不能重複,但是插入資料是又不能立刻決定,而需要後期更新,所以一開始學號是空值,後期更新,所以就產生了標題中的需求。列可以為空,但是如果有值的話,值不能重複。
3、自定義約束函式
create function student_no_unique(@arg varchar(255))
returns bit
as
begin
declare @result bit
if((select COUNT(*) from student stu where stu.student_no is not null and stu.student_no=@arg)>1)
set @result = 0
else
set @result = 1
return @result
end
解釋幾個地方:
1.@arg 是函式的引數,資料型別要和該列一致。
2.if條件使用 >1,而不是 >0,如果是大於0的話,只能插入空值。我猜想約束的執行過程是:插入資料 > 驗證資料是否符合約束 > 若不符合,則回滾。
4、增添約束
alter table student
add constraint student_no_unique_constraint check (dbo.student_no_unique(student_no)=1)
將要插入的資料的student_no作為引數傳遞給函式。
5、測試資料
insert into student values('name1',null)
insert into student values('name2',null)
insert into student values('name3','123456')
insert into student values('name4','123456')
insert into student values('name5','123')
執行結果為
(1 行受影響)
(1 行受影響)
(1 行受影響)
訊息 547,級別 16,狀態 0,第 4 行
INSERT 語句與 CHECK 約束"student_no_unique_constraint"衝突。該衝突發生於資料庫"OnlineStore",表"dbo.student", column 'student_no'。
語句已終止。
(1 行受影響)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4686/viewspace-2808178/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [20191206]nvl與非空約束.txt
- 震驚 PHP empty 函式判斷結果為空,但實際值卻為非空PHP函式
- 為什麼 php empty 函式判斷結果為空,但實際值卻為非空PHP函式
- PyQt5 實現可空值的 QDateTimeEditQT
- 主鍵約束、唯一約束和唯一索引索引
- 需要取最近的非空值
- 在 SQL Server 中,建立表時可以直接為欄位新增唯一約束(UNIQUE)SQLServer
- 阿里Java學習路線:階段 2:資料庫開發-SQL進階及查詢練習:課時6:非空和唯一約束阿里Java資料庫SQL
- 【SQL】15 SQL 約束(Constraints)、NOT NULL 約束、UNIQUE 約束、PRIMARY KEY 約束、FOREIGN KEY 約束、CHECK 約束、DEFAULT約束SQLAINull
- 註解實現:判空賦值賦值
- SQL Server 資料表程式碼建立約束SQLServer
- Kotlin可空型別與非空型別以及`lateinit` 的作用Kotlin型別
- pandas.DataFrame讀取特定的列並刪除某列空值所在的行
- JS如何判斷一個陣列是否為空、是否含有某個值JS陣列
- SQL約束SQL
- 實現MyBatisPlus自定義sql注入器MyBatisSQL
- SQL Server中使用Check約束達到提升效能SQLServer
- 物件導向 約束、自定義異常、加密物件加密
- 對存在空值的列建索引索引
- PostgreSQL唯一約束如何使用?SQL
- SQL Server 檢視錶佔用空間大小SQLServer
- 肯定賦值斷言與非空斷言賦值
- Mysql-基本練習(06-唯一約束、外來鍵約束、新增、刪除單列)MySql
- Nestjs最佳實踐教程(六): 簡化程式碼與自定義約束JS
- SQL Server Profiler(P)導致C盤空間不足SQLServer
- SQL Server檢視所有表大小,所佔空間SQLServer
- SQL外來鍵約束的含義及建立SQL
- 帝國CMS欄目管理增加自定義欄位值的為空判斷
- O1空間複雜度實現陣列迴圈右移_LeetCode189複雜度陣列LeetCode
- hadoop 自定義GroupComparator實現求最大值Hadoop
- [非專業翻譯] Mapster - 自定義命名約定
- iOS自定義控制元件:自定義TableView、CollectionView空資料佔點陣圖iOS控制元件View
- MyBatis陣列與集合判斷非空和長度MyBatis陣列
- SQL Server實戰七:自定義資料型別、標量值、內嵌表值、多語句表值函式的操作SQLServer資料型別函式
- 判斷空值
- Java 定義長度為 0 的陣列 / 空陣列Java陣列
- 記錄個Java/Groovy的小問題:空字串呼叫split函式返回非空陣列Java字串函式陣列
- 如何過濾掉 PHP 陣列中的空值?PHP陣列