sqlPreparedStatement:如果不存在则INSERT INTO

时间:2016-12-14 09:41:35

标签: mysql sql prepared-statement

我正在尝试使用preparedStatement来INSERT数据,只要它们在我的数据库中不存在但我收到错误。

#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

1 个答案:

答案 0 :(得分: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,这些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