2017-12-13 44 views
0

私はこのコードを複数試してみましたが、SQLの状態:42601エラーを与え続けます。私はドキュメントを見て、時々動作する例を使って試しましたが、私がしたいことはしません。PostgreSQLのIF値が存在しないTHEN INSERTの値

IF (SELECT guildid FROM Servers <> 1) THEN 
    INSERT INTO Servers (guildid) VALUES (1) 
END IF; 

マイサーバーテーブルは単純です。私はguildidと呼ばれる単一行を持っています。私はメッセージを出力するだけなので、CASE文は必要ありません。

+0

'CASE'式(ない「文」)をいない「出力メッセージ」を行います。 –

+0

おそらく 'guildid * 'と呼ばれる' column'があります。 '行'には名前がありません。 –

答えて

1

あなたは、その後、(ifアプローチが提案する)競合条件を心配する必要がない場合:

INSERT INTO Servers (guildid) 
    SELECT guildid 
    FROM (VALUES (1)) v(guildid) 
    WHERE NOT EXISTS (SELECT 1 FROM Servers s WHERE s.guildid = v.guildid); 

テーブルを保護するために、私はそれに一意のインデックスを追加することを示唆しています。実際には、guildidをプライマリキーと宣言してください。その場合、重複した値を挿入しようとすると元の挿入が失敗するだけです。あなたがその列に一意制約がある場合は

+0

値が存在しないたびに別の行に別の値を挿入するにはどうすればよいでしょうか? (したがって、2つの異なる行に2つの値があります) –

+0

@SethDeegan。 。 。新しい質問は質問ではなく、コメントでお願いします。 –

+0

あなたは 'FROM(VALUES(1))v(guildid)'の仕方を説明できますか? FROMの後には、列名があるはずです。これはプレースホルダシステムのように見えますが、私はそれに関するドキュメントを見つけることができません。クエリを説明して、ドキュメントソースを提供してください。 –

0

、あなたはon conflict do nothingを使用することができます。

INSERT INTO Servers (guildid) VALUES (1) 
ON CONFLICT DO NOTHING; 
関連する問題