我正试图在我的PostgreSQL数据库上编写一个UPSERT代码。
使用
NamedParameterJdbcTemplate
我收到以下错误消息:
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [
INSERT INTO MY_TABLE
(ID,DATE_TIMESTAMP,ENVIRONMENT,REGION,ORGANIZATION,ARRIVAL_TIMESTAMP,LAST_UPDATED)
VALUES (?,?,?,?,?,?,?)
ON CONFLICT (ID, DATE_TIMESTAMP, ENVIRONMENT, REGION)
DO UPDATE
]; nested exception is org.postgresql.util.PSQLException: ERROR: syntax error at end of input] with the root cause
org.postgresql.util.PSQLException: ERROR: syntax error at end of input
查询:
INSERT INTO MY_TABLE
(ID,DATE_TIMESTAMP,ENVIRONMENT,REGION,ORGANIZATION,ARRIVAL_TIMESTAMP,LAST_UPDATED)
VALUES (:ID,:DATE_TIMESTAMP,:ENVIRONMENT,:REGION,:ORGANIZATION,:ARRIVAL_TIMESTAMP,:LAST_UPDATED)
ON CONFLICT (ID, DATE_TIMESTAMP, ENVIRONMENT, REGION)
DO UPDATE
我试过没有冲突的情况,效果很好。
我尝试添加SET命令,但没有成功。
我还尝试在DO UPDATE SET语句之后使用setter我也尝试过您的解决方案,使用EXCLUDED.column_NAME 为我想要更新的每一列添加一个SET语句
我收到以下错误消息:
ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification Call getNextException to see other errors in the batch.
关于如何解决这个问题有什么建议吗?
我找到了一个解决方案。
错误的原因是我选择的约束。
CONFLICT条件必须是CONSTRAINT。例如,主键。
请参阅此处的完整文档:https://www.postgresql.org/docs/9.5/sql-insert.html
ON CONFLICT可用于指定引发唯一约束或排除约束冲突错误的替代操作。(见下文关于冲突条款。(