まず、SQL文PREPARE
/EXECUTE
は、MySQLとPostgreSQLで異なる構文を持っています。彼らは互換性がありません。
のMySQL:
SET @preparedStatement =
'INSERT INTO test (id_test, name, other) VALUES (''1'', ''TEST'', ?)';
PREPARE alterIfNotExists FROM @preparedStatement;
SET @other = 'STRING'
EXECUTE alterIfNotExists USING @other;
DEALLOCATE PREPARE alterIfNotExists;
のPostgreSQL:
PREPARE alterIfNotExists(text) AS
INSERT INTO test (id_test, name, other) VALUES ('1', 'TEST', $1);
EXECUTE alterIfNotExists('STRING');
DEALLOCATE PREPARE alterIfNotExists;
あり、すべての言語でのパラメータ化クエリのAPIがあり、これらは、MySQLとPostgreSQLとの互換性がある可能性が高くなります。 PDOとPHPで例えば、使用量がデータベース(およびその他)の両方で同じです:
<?php
$stmt = $pdo->prepare(
"INSERT INTO test (id_test, name, other) VALUES ('1', 'TEST', ?)");
$stmt->execute(["STRING"]);
あなたの質問の他の部分については、データがすでにある場合に挿入控えるように、このMySQLとPostgreSQL間でも異なる処理が行われます。
のMySQL:
INSERT IGNORE INTO ...
インサートが、あらゆる種類のエラーにつながる場合、これはただのインサートをスキップします。
また、一意キー列の値を持つ行が存在する場合は、行を現在の値に変更することもできます。
INSERT INTO test (id_test, name, other) VALUES ('1', 'TEST', ?)
ON DUPLICATE KEY UPDATE name=VALUES(name), other=VALUES(other);
のPostgreSQL:
INSERT INTO test (id_test, name, other) VALUES ('1', 'TEST', ?)
ON CONFLICT DO NOTHING;
か:
INSERT INTO test (id_test, name, other) VALUES ('1', 'TEST', ?)
ON CONFLICT DO UPDATE SET ...
はhttps://www.postgresql.org/docs/current/static/sql-insert.html#SQL-ON-CONFLICT
タグあなたが使用しているDBMSを参照してください。 (答えは使用する製品によって異なる場合があります) – jarlh
構文はmysqlとpostgresqlで動作するはずです – wawanopoulos
私はPostgreSQLがこれらのバックティックをうまく処理しているとは思いません。そして、おそらくリテラルに対する単一引用符を必要とします。 (ANSI SQLの方法。) – jarlh