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

SQL Serverで外部キー制約を無効にする方法(T-SQLの例)

    SQL Serverで外部キー制約を無効にする必要がある場合は、Transact-SQLを使用して無効にする方法を次に示します。

    これにより、外部キーに制限されることなくデータを入力できるようになります。明らかに、そうする非常に正当な理由がない限り、これを行うことはありません。外部キーは参照整合性を強制するため、それらを無効にすると、あらゆる種類の問題が発生する可能性があります。

    例1-外部キー制約を無効にする

    外部キー制約を無効にするには、NOCHECKを使用します ALTER TABLE内の引数 ステートメント。

    このように:

    ALTER TABLE BandMember 
    NOCHECK CONSTRAINT FK_BandMember_Musician; 
    

    このコードは、 FK_BandMember_Musician と呼ばれる外部キー制約を無効にします 。

    例2–制約を確認する

    sys.foreign_keysにクエリを実行できます 制約が無効になっていることを確認するためのシステムビュー:

    SELECT 
      name AS 'Constraint',
      is_disabled,
      is_not_trusted
    FROM sys.foreign_keys;
    

    結果:

    +--------------------------------+---------------+------------------+
    | Constraint                     | is_disabled   | is_not_trusted   |
    |--------------------------------+---------------+------------------|
    | FK_BandMember_Band             | 0             | 0                |
    | FK_BandMember_Musician         | 1             | 1                |
    | FK_MembershipPeriod_BandMember | 0             | 0                |
    +--------------------------------+---------------+------------------+
    

    この場合、現在のデータベースからすべての外部キー制約を選択しました。

    無効になっているのはこれだけであることがわかります( is_disabled のため) 列が 1 に設定されている 。

    is_not_trusted に気付くかもしれません 列も 1 に設定されます 。これは、制約がシステムによって検証されていないことを示しています。

    制約がすべてのデータをチェックしたとはもはや想定できないため、これは理にかなっています。制約が無効になっているという事実は、データが制約によってチェックされることなくデータベースに入ることができることを意味します。したがって、データベースに無効なデータが存在する可能性があります。

    制約を再度有効にする必要がある場合は、(WITH CHECKを使用して、制約の信頼を復元する機会があります。 オプション)。これにより、制約を有効にする前に既存のすべての行がチェックされます。

    しないオプションもあります 既存のデータをチェックしますが、これはまれなケースでのみ実行する必要があります。

    これも同じクエリですが、テーブルと参照されるテーブルを表示するための追加の列がいくつかあります。

    SELECT 
      name AS 'Constraint',
      OBJECT_NAME(parent_object_id) AS 'Table',
      OBJECT_NAME(referenced_object_id) AS 'Referenced Table',
      is_disabled,
      is_not_trusted
    FROM sys.foreign_keys;
    

    結果:

    +--------------------------------+------------------+---------------------+---------------+------------------+
    | Constraint                     | Table            | Referenced Table    | is_disabled   | is_not_trusted   |
    |--------------------------------+------------------+---------------------+---------------+------------------|
    | FK_BandMember_Band             | BandMember       | Band                | 0             | 0                |
    | FK_BandMember_Musician         | BandMember       | Musician            | 1             | 1                |
    | FK_MembershipPeriod_BandMember | MembershipPeriod | BandMember          | 0             | 0                |
    +--------------------------------+------------------+---------------------+---------------+------------------+
    

    1. MySQL length()とchar_length()

    2. MySQLクエリが返した行数をカウントするにはどうすればよいですか?

    3. インクリメンタル統計は、クエリオプティマイザでは使用されません

    4. SQLクエリでOracleスキーマサイズを表示するにはどうすればよいですか?