ON CONFLICT(id) DO UPDATE SET 不适用于 DELPHI 10.3.1 中的 FireDAC

ON CONFLICT(id) DO UPDATE SET does not work for FireDAC in DELPHI 10.3.1

附加第二个数据库后,我尝试使用 ON CONFLICT(id) DO UPDATE 在第一个数据库的 table 中插入和更新数据。字段id是第一个table.

的主键
  FDQuery1.EXECSQL('ATTACH ''D:\Update2019.DB'' AS DBUpdate');

  FDQuery1.SQL.Text:=
    'INSERT INTO acts (id,title) SELECT id,title FROM DBUpdate.acts'+
    '   WHERE (DBUpdate.acts.id >100)'+
    '   ON CONFLICT(id) DO UPDATE SET'+
    '   title=excluded.title;'
  FDQuery1.ExecSQL;

我收到错误消息:"ERROR near "ON":syntax error" 当我删除 WHERE (DBUpdate.acts.id >100 条件 错误消息 AS: "ERROR near "DO":syntax error".

相同的查询在 SQLITESTUDIO 中运行良好。

如评论中正确指出的那样,您的应用程序使用的 SQLite 不支持此语法。您将需要使用更新版本的 SQLite。为此,请遵循 FireDAC SQLite connection 主题的 动态链接 段落,否则 Delphi 使用随附版本的静态链接 SQLite 对象构建您的 FireDAC 应用程序(其中使您的应用程序依赖于这样的 SQLite 版本,无论周围有什么 SQLite DLL)。

请不要忘记此任务中最重要 的部分;修改 FireDAC.inc 包含文件以使用动态链接。如果你不想破坏你的 Delphi 安装源文件夹,例如将所有 FireDAC 模块复制到其他地方,将它们添加到项目的构建搜索路径中,然后修改 FireDAC.inc 在那里包含文件。