シナリオ:
SQL Server開発者として働いている場合、FName列の1つの既存のテーブルdbo.Employeeにチェック制約を追加し、チェック制約のロジックを記述して、常にアルファベットを受け入れるようにするように求められます。チェック制約を追加すると、以下のエラーが発生します。
メッセージ547、レベル16、状態0、19行目
ALTERTABLEステートメントがチェック制約「Chk_dbo_Employee_FName」と競合しました。
データベース"YourDatabaseName"、テーブル "dbo.Employee"、列'FName'で競合が発生しました。
解決策:
最初にエラーのシナリオを生成しましょう。いくつかのサンプルデータを使用してサンプルdbo.Employeeテーブルを作成します。--Create Table use YourDatabaseName go Create table dbo.Employee ( FName VARCHAR(100) Not Null, LName VARCHAR(100), StreetAddress VARCHAR(255) ) --Insert data in sql table insert into dbo.Employee(FName,LName,StreetAddress) values ('Aamir','Shahzad','xyz address') go insert into dbo.Employee(FName,LName,StreetAddress) values ('Raza A',Null,'abc address') go
次に、alter tableステートメントを実行して、チェック制約を追加します。このステートメントを実行すると、上記のエラーが発生します。既存のデータはチェック制約の対象とならないためです。 'Raza A'の名にスペースがあり、Check Constraintは、FNameのデータは常にアルファベットである必要があることを示しています。
Alter table dbo.Employee Add Constraint Chk_dbo_Employee_FName Check (FName not like '%[^a-z]%')1)最初の解決策:既存のDataFistソリューションを修正することができます。チェック制約の対象とならないデータを見つけて修正し、チェック制約を追加します。
2)ビジネスが既存のデータを修正したくない場合は先に進むことからチェック制約を実装したい場合は、Nocheckを使用してチェック制約を作成できます。そうすることで、既存のデータをチェック制約ルールに対して検証せず、新しいデータにのみ適用します。
Alter table dbo.Employee with nocheck Add Constraint Chk_dbo_Employee_FName Check (FName not like '%[^a-z]%')いくつかのレコードを挿入して、制約が期待どおりに機能しているかどうかを確認しましょう。
insert into dbo.Employee(FName,LName,StreetAddress) values ('Test 123',Null,'test address') go insert into dbo.Employee(FName,LName,StreetAddress) values ('Najaf',Null,'test address') go最初の挿入は、チェック制約ルールに適合しないため失敗します。 2番目のレコードが正常に挿入されます。テーブルのデータを確認しましょう。
SQLServerの既存のデータを含む列にチェック制約を追加する方法 |
ビデオデモ:ALTERTABLEステートメントがチェック制約と競合するエラーを修正する方法