0

全て、

COPY TOコマンドを使用してテーブルにデータを一括挿入しようとしていますが、一意キーエラーを回避できないようです。これが私のワークフローです。

別のサーバーに移動したいデータのダンプを作成する

COPY (
  SELECT *
  FROM mytable
  WHERE created_at >= '2012-10-01')
    TO 'D:\tmp\file.txt'

ターゲットDBに新しい「一時」テーブルを作成し、そのようにデータをコピーします。

COPY temp FROM 'D:\tmp\file.txt'

ここで、データを「temp」テーブルからターゲットDBのマスターテーブルに移動したいと思います。

 INSERT INTO master SELECT * FROM temp 
                WHERE id NOT IN (SELECT id FROM master)

これは正常に実行されますが、何も挿入されず、フィールドは更新されません。誰かがここで何が起こっているのか手がかりを持っていますか?tempとmasterのスキーマは同じです。この問題に関するどんな助けも素晴らしいでしょう!Postgresql9.2を使用しています

アダム

4

1 に答える 1

1

これはnull、リストに値がある場合に発生する可能性がありINます。

SQLでは、null比較を行うときに常に存在します(一致を取得するには特別なテストfalseが必要です)。これには、から返される値がある場合にリスト全体IN NULLが一致しないという不幸な結果があります。nullSELECT id FROM master

このクエリから返される行があるかどうかを確認します。

SELECT id
FROM master
WHERE id is null;

そうでない場合、これあなたの問題ではありません。

値がある場合、修正はnullリストからIDを除外することです。

INSERT INTO master
SELECT *
FROM temp 
WHERE id NOT IN (SELECT id FROM master where id is not null)


考慮すべきもう1つのことは、まだ挿入されていない値がないということです。

于 2012-10-31T23:29:04.663 に答える