sql >> データベース >  >> RDS >> Sqlserver

ALTERTABLEステートメントがSQLServerのCHECK制約と競合していました-SQLServer/TSQLチュートリアルパート89

    シナリオ:

    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ステートメントがチェック制約と競合するエラーを修正する方法


    1. Google Data Analytics Professional証明書は価値がありますか?

    2. SQLクエリで(func())。*構文を使用して複数の関数評価を回避するにはどうすればよいですか?

    3. 整数の配列がありますが、mysqlクエリ(php)でそれぞれをどのように使用しますか?

    4. MicrosoftAccessデータベースのSQLServerへの移行