シナリオ:
SQL Server開発者として作業している場合は、[名]、[年齢]、および[年齢タイプ]列を持つdbo.Customerテーブルを作成する必要があります。 CustomerIdをIdentityとして追加できます。以下のロジックを使用して、年齢および年齢タイプの列にチェック制約を作成する必要があります
<65 agetype ="Adult" and ="" p ="">
trueの場合、レコードの挿入または更新を許可します。それ以外の場合は、チェック制約のために失敗します。
65>
<65 agetype ="Adult" and ="" p ="">解決策:65>
<65 agetype ="Adult" and ="" p ="">以下のスクリプトを使用して、要件に応じて複数の列にチェック制約を追加できます。65>
CREATE TABLE dbo.Customer (
CustomerId INT identity(1, 1)
,NAME VARCHAR(100)
,Age INT
,AgeType VARCHAR(15)
,CONSTRAINT dbo_Customer_AgeAndAgeType CHECK (
(
Age <= 17
AND AgeType = 'Child'
)
OR (
Age > 17
AND Age < 65
AND AgeType = 'Adult'
)
OR (
Age >= 65
AND AgeType = 'Senior'
)
)
) いくつかのレコードを挿入して、チェック制約が期待どおりに機能しているかどうかを確認してみましょう。
--Correct values accrording to Constraint
insert into dbo.Customer(Name,Age,AgeType)
Values('Najaf',13,'Child')
go
--Wrong values according to Check Constraint
insert into dbo.Customer(Name,Age,AgeType)
Values('Leena',14,'Adult')
go
--Correct values accroding to Constraint
insert into dbo.Customer(Name,Age,AgeType)
Values('Raza',30,'Adult')
go
--Wrong values according to Check Constraint
insert into dbo.Customer(Name,Age,AgeType)
Values('Aamir',30,'Senior')
go
--Wrong values according to Check Constraint
insert into dbo.Customer(Name,Age,AgeType)
Values('John',65,'Adult')
go
--Correct values accroding to Constraint
insert into dbo.Customer(Name,Age,AgeType)
Values('Kris',65,'Senior')
go (1行が影響を受けます)
メッセージ547、レベル16、状態0、行25
INSERTステートメントがCHECK制約「dbo_Customer_AgeAndAgeType」と競合しました。データベース「YourDatabaseName」、テーブル「dbo.Customer」で競合が発生しました。
ステートメントは終了しました。
(1行が影響を受けました)
Msg 547、レベル16、状態0、33行目
INSERTステートメントがCHECK制約「dbo_Customer_AgeAndAgeType」と競合していました。データベース「YourDatabaseName」、テーブル「dbo.Customer」で競合が発生しました。
ステートメントが終了しました。
メッセージ547、レベル16、状態0、37行目
INSERTステートメントが競合しました。 CHECK制約「dbo_Customer_AgeAndAgeType」。データベース"YourDatabaseName"、テーブル"dbo.Customer"で競合が発生しました。
ステートメントが終了しました。
(1行が影響を受けました)
selectクエリを使用してテーブル内のデータを確認してみましょう。以下に示すように、チェック制約に合格したレコードのみが挿入されます。残りのレコードを挿入できませんでした。
|
| SQLServerテーブルの複数の列にチェック制約を作成する方法 |
レコードを更新して、チェック制約が期待どおりに機能しているかどうかを確認してみましょう。
update dbo.Customer set Age=30 where Customerid=1
チェック制約ロジックに従って、AgeType ='Child'にAge30を設定できないため、以下のエラーで失敗しました。
Msg 547、レベル16、状態0、 18行目
UPDATEステートメントがCHECK制約「dbo_Customer_AgeAndAgeType」と競合していました。データベース「YourDatabaseName」、テーブル「dbo.Customer」で競合が発生しました。
ステートメントは終了しました。
ビデオデモ:チェック制約を作成する方法SQLServerの複数の列