我正在尝试使用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
答案 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