none
外部キーを無視してINSERT する方法ってありますか。 RRS feed

  • 質問

  • お世話になっております。現在旧テーブルA⇒新テーブルAに移行するためのSQL文を作成しています。
    このテーブルには外部キーを持っているので、とりあえず参照整合性を無視してINSERTしたいのですが、何か方法をありませんでしょうか?
    WITH (IGNORE_CONSTRAINTS)句を付けたいのですが、これはBULKインサートでしか使えないようで、エラーとなってしまいます。
    同じことが出来るINSERT 文の書き方は無いでしょうか?


    ※参考までにこの様なSQL文を書いています。
     INSERT INTO TEST ( aa, bb, cc, dd, ee ) SELECT ( aa, bb, cc, dd, ee ) FROM [LINK_SERVER].[dbo].[TEST] ;

     

     

     

    2010年4月23日 7:15

回答

すべての返信

  • 一度alter table構文を使って制約をdropし、insertされてはいかがでしょうか。
    2010年4月23日 8:00
    モデレータ
  • table数が10程度あり、自分がオペレーションする訳ではないので、できれば、そのままの状態でinsertしたいです。また、ツール化(EXCELマクロで自動生成)しようとしているので、その意味でも自動でやりたいです。

    2010年4月23日 8:10
  • 私はinsertで制約を無視する方法を存じていないのですが、もしにっきーさんがおっしゃるような操作ができたとしても、その後整合性をとるための作業はされるのだと思います。その作業後に制約を有効にする形ではだめでしょうか。

    思いついた方法を記載します。

    ・外部参照先のテーブルを先にデータ整備し、insertそのものがうまくいくようにする(insertの順番を見直す)

    ・SSISパッケージを使い、一度CSV等に落とし、bulk insertし、制約を無視する

    ・(先に述べた)制約を一度無効にし、insertを行う

    2010年4月23日 8:54
    モデレータ
  • NOCHECK CONSTRAINTが使えそうです。

    DB内のオブジェクト(テーブル)の全部の制約を無効/有効にする
    http://daily-postit.blogspot.com/2009/07/db.html


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク にっきー 2010年4月26日 9:21
    2010年4月23日 13:26
  • ありがとうございました。

    無事期待通りの動作が出来ました。

    2010年4月26日 9:21