星期二, 9月 25, 2018

[SQL] Check 條件約束

最近因為無法確認 AP 端問題在哪,導致必須在 SQL Server 上建立條件約束來避免異常資料存進來,就順道整理條件約束相關內容
  • 建立 Check 並測試

USE tempdb
GO

-- 判斷資料表是否存在
DROP TABLE IF Exists Temp

-- 建立 Temp Table
CREATE TABLE Temp (StartDate Date , EndDate Date)

-- 假設該資料表和欄位已存在,要加上 Check 條件約束
ALTER TABLE Temp
ADD CONSTRAINT CK_DateCompare CHECK (StartDate < EndDate ); 

-- 建立錯誤資料
INSERT INTO Temp (StartDate , EndDate) VALUES('20180919','20180901')
INSERT 陳述式與 CHECK 條件約束 "CK_DateCompare" 衝突。衝突發生在資料庫 "tempdb",資料表 "dbo.Temp"。
[SQL] Check 條件約束-1
  • 修改 Check
無法直接利用 TSQL 語法修改 Check 條件約束,必須先刪除再新增
-- 刪除 Check 條件
ALTER TABLE Temp
DROP CONSTRAINT CK_DateCompare 

-- 再建立新的條件約束
ALTER TABLE Temp
ADD CONSTRAINT CK_DateCompare CHECK (StartDate <= EndDate); 
  • 停用、啟用 Check
-- 使用 INSERT 與 UPDATE 陳述式停用檢查條件約束
ALTER TABLE Temp NOCHECK CONSTRAINT CK_DateCompare
[SQL] Check 條件約束-2--
-- 啟用:
-- 於 INSERT 或 UPDATE 時強制套用:是
-- 檢查建立或重新啟用時的現有資料:否
ALTER TABLE Temp CHECK CONSTRAINT CK_DateCompare
[SQL] Check 條件約束-3
-- 啟用:
-- 於 INSERT 或 UPDATE 時強制套用:是
-- 檢查建立或重新啟用時的現有資料:是
ALTER TABLE Temp WITH CHECK CHECK CONSTRAINT CK_DateCompare
[SQL] Check 條件約束-1 - 複製
  • 利用 TSQL 查詢條件約束
SELECT 
  s.[name] AS ScheamName ,
  o.[name] AS TableName ,
  i.[name] AS CheckName ,
  i.definition ,
  i.type_desc ,
  i.create_date ,
  i.modify_date ,
  i.is_disabled ,
  i.is_not_for_replication ,
  i.is_not_trusted
FROM sys.check_constraints i
  INNER JOIN sys.objects o ON i.parent_object_id = o.[object_id]
  INNER JOIN sys.schemas s ON o.[schema_id] = s.[schema_id]
GO

沒有留言:

張貼留言