2016-07-20 13 views
1

同じスキーマを持つ2つのテーブルtable1とtest_table1があります。原因test_table1内の既存のテーブル1からのPK値にpostgresql select into from select

insert into test_table1 select * from table1; 

が、これは失敗します。

両方のテーブルには、私がやりたい1.

から始まる行/データおよびPK IDを持っています。

列を指定し、PK列を残しますが、何らかの理由でいずれかの動作していないthatsのことであろうその周り

ウェイ:例えばを

NOTE -

insert into test_table1 (col1, col2,..., coln) select col1,col2,...,coln from table1; 

戻り

ERROR: duplicate key value violates unique constraint "test_table1_pkey" DETAIL: Key (id)=(1) already exists.

私はこれは、MySQLで動作します知っている以下のクエリではありませんPK列、これはちょうどPostgresqlのが原因でしょうか?とにかくその周りに?

編集:

両方のテーブルには主キーとシーケンスセットがあります。

テーブルが同じデータを持っていないことは明らかでした。 table1からtest_table1に行を追加したいだけです。

プライマリキーをクエリから除外するように指示する回答については、前にも述べたとおりでした。

+0

どのバージョンですか? 9.5を使用している場合は、 'INSERT .. ON CONFLICT'が動作します。 – Nicarus

+1

テーブルをプライマリキーに設定し、すでに存在する値をテーブルに挿入しています。あなたのMySQLテーブルに一意のプライマリキーが定義されていないため、MySQLで動作しました。完全な答えを得るために、テストテーブルのテーブルスキーマ(制約を含む)を教えてください。 (明らかにする必要があります...行が既にtest_table1に存在し、再度挿入しようとしていますか、またはtest_table1の値をtable1と同じに更新しようとしていますか?) – Twelfth

+1

プライマリを除くすべての列をリストしますキー。ただし、新しいプライマリキーが割り当てられます。 –

答えて

0

ようUPDATE JOINちょうどクエリ

insert into test_table1 (col2,..., coln) select col2,...,coln from table1; 

の列からのPK列を削除したいと思います。 既存のPK列

create sequence test_table1_seq; 
ALTER TABLE test_table1 
    ALTER COLUMN col1 SET DEFAULT nextval('test_table1_seq'::regclass); 

にシーケンスを作成し、あなたが何をしたいのか、現在の

SELECT setval('test_table1_seq', (SELECT MAX(col1) FROM test_table1)); 
+0

こんにちはTaleh、返信のために、私は質問を編集しました - pkカラムは決してクエリにはありませんでしたが、シーケンスの両方のテーブルに存在します。 –

0

あなたは、むしろそれはまだ多分あなたはPKの列に順序付けされていない障害が発生した場合

UPDATE test_table1 AS v 
SET col1 = s.col1, 
col2 = s.col2, 
col3 = s.col3, 
..... 
colN = s.colN 
FROM table1 AS s 
WHERE v.id = s.id; 
0

にシーケンス値を更新することはアップサートです。

with upsert as (
    update test_table1 tt 
    set col1 = t.col1, 
     col2 = t.col2, 
     col3 = t.col3 
    from table1 t 
    where t.id = tt.id 
    returning * 
) 
insert into test_table1(id, col1, col2, col3) 
select id, col1,col2,col3 
from table1 
where not exists (select * from upsert) 
0

この投稿hereは私が何が悪かったのかわからない、私の問題を解決する助けました。