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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【CONSTRAINT】具有唯一性約束的列是否可以插入空值AI
- SQL Server唯一約束的使用SQLServer
- SQL Server不可以增加非空列SQLServer
- 資料遷移判斷非空約束
- 建立Oracle唯一約束,忽略已有的重複值Oracle
- [20120410]9i下索引與空值查詢以及非空約束.txt索引
- 震驚 PHP empty 函式判斷結果為空,但實際值卻為非空PHP函式
- 為什麼 php empty 函式判斷結果為空,但實際值卻為非空PHP函式
- 約束:確保資料的完整性(主鍵,唯一,檢查,預設,非空,外來鍵)
- PyQt5 實現可空值的 QDateTimeEditQT
- Sql Server系列:鍵和約束SQLServer
- 需要取最近的非空值
- 阿里Java學習路線:階段 2:資料庫開發-SQL進階及查詢練習:課時6:非空和唯一約束阿里Java資料庫SQL
- Oracle主鍵約束、唯一鍵約束、唯一索引的區別(轉)Oracle索引
- SQL中的空值NULLSQLNull
- 在 SQL Server 2005 中使用表值函式來實現空間資料庫SQLServer函式資料庫
- 註解實現:判空賦值賦值
- PostgreSQL唯一約束如何使用?SQL
- 【SQL】15 SQL 約束(Constraints)、NOT NULL 約束、UNIQUE 約束、PRIMARY KEY 約束、FOREIGN KEY 約束、CHECK 約束、DEFAULT約束SQLAINull
- SQL SERVER 自定義函式SQLServer函式
- 物件導向 約束、自定義異常、加密物件加密
- Mysql-基本練習(06-唯一約束、外來鍵約束、新增、刪除單列)MySql
- SQL約束SQL
- JS如何判斷一個陣列是否為空、是否含有某個值JS陣列
- Kotlin可空型別與非空型別以及`lateinit` 的作用Kotlin型別
- SQL Server 資料表程式碼建立約束SQLServer
- 肯定賦值斷言與非空斷言賦值
- Sql Server系列:自定義函式SQLServer函式
- 主鍵(PK)與非空唯一索引(Unique Index)的區別索引Index
- SQL Server資料庫中處理空值時常見問題SQLServer資料庫
- 表中已有資料,將表中某個欄位為空的改為非空
- Oracle定義約束 外來鍵約束Oracle
- SQL Server中使用Check約束達到提升效能SQLServer
- 非空+預設值——一種選擇方案思路
- Nestjs最佳實踐教程(六): 簡化程式碼與自定義約束JS
- SQL外來鍵約束的含義及建立SQL
- 實現MyBatisPlus自定義sql注入器MyBatisSQL
- 使用RMAN實現可傳輸的表空間