2016-12-14 18 views
1

データベースに存在しないのにエラーが発生した場合にのみ、preparedStatementを使用してデータをINSERTしようとしています。sqlPreparedStatement:INSERT INTOが存在しない場合

#1064 - Erreur de syntaxe près de 'INTO `test` (`id_test`, `name`) VALUES ("1", "TEST")' à la ligne 1 

コード:すべての

SET @preparedStatement = INSERT INTO `test` (`id_test`, `name`) VALUES ("1", "TEST"); 
PREPARE alterIfNotExists FROM @preparedStatement; 
EXECUTE alterIfNotExists; 
DEALLOCATE PREPARE alterIfNotExists; 

DEZ

+0

タグあなたが使用しているDBMSを参照してください。 (答えは使用する製品によって異なる場合があります) – jarlh

+0

構文はmysqlとpostgresqlで動作するはずです – wawanopoulos

+1

私はPostgreSQLがこれらのバックティックをうまく処理しているとは思いません。そして、おそらくリテラルに対する単一引用符を必要とします。 (ANSI SQLの方法。) – jarlh

答えて

1

まず、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

関連する問題