【问题标题】:INSERT INTO table SELECT not working with constant values in H2 DBINSERT INTO table SELECT 不适用于 H2 DB 中的常量值
【发布时间】:2017-10-13 17:59:29
【问题描述】:

以下是 H2DB 查询

 INSERT INTO userpermission (userid, permissionid, createddt, createdby, updateddt, updatedby)
            SELECT u.userid, p.permissionid, now(), ("1"), now(), ("1") FROM user u, permission p
            WHERE u.email = "csr_admin@example.com";

我想要实现的是在用户表中为用户表中具有给定电子邮件地址的用户插入一条记录,对于权限表中的每个权限。

以下是错误

 Reason: liquibase.exception.DatabaseException: Column "1" not found; SQL statement:
                                    INSERT INTO userpermission (userid, permissionid, createddt, createdby, updateddt, updatedby)
                                                SELECT u.userid, p.permissionid, now(), ("1"), now(), ("1") FROM user u, permission p
                                                WHERE u.email = "csr_admin@example.com" [42122-193] [Failed SQL: INSERT INTO userpermission (userid, permissionid, createddt, createdby, updateddt, updatedby)
                                                SELECT u.userid, p.permissionid, now(), ("1"), now(), ("1") FROM user u, permission p
                                                WHERE u.email = "csr_admin@example.com"]

相同的查询在 MySQL 中运行。

【问题讨论】:

  • 不确定 H2,但在所有 RDMS 中,常量都用单引号声明。大括号也是不必要的。将("1") 替换为'1'
  • 是的,我在添加大括号之前尝试过。不工作。
  • 也将双引号替换为单引号。只需先运行 select 语句。此外,您正在通过不提供连接条件进行交叉连接。这是故意的吗?
  • 你是对的。我不得不用单引号替换 where 子句。 MySQL会接受它,但不会接受H2。谢谢!
  • 乐于助人。我也将评论作为答案。接受它,这样问题就可以结束了。谢谢!

标签: sql h2 liquibase h2db


【解决方案1】:

如 cmets 中所述,

  1. 对字符串常量使用单引号。
  2. 不要在选择子句中使用带有常量的大括号。
  3. 检查连接条件。如果没有基于公共列匹配 2 个表,您正在执行 Cartesian product

【讨论】:

  • 只有第一点是错误的原因。大括号是可选的。 3 在我的情况下是故意的。我希望将值插入到交叉产品表中以进行测试,这些值通常是手动输入的。
  • 好的。感谢您清理它,因为笛卡尔积困扰着我。
【解决方案2】:

我遇到了类似的问题。当我的 springboot 应用程序首次运行时,我想在我的 H2 中插入一些默认值。我的 schema.sql 和 data.sql 都正确。

但是,当我执行select * 时,它仍然不会将示例数据加载到 H2 Schema 表中。环顾了一个小时后。我决定查看application.properties 文件。我变了

spring.jpa.hibernate.ddl-auto=create-drop

spring.jpa.hibernate.ddl-auto=none

spring.jpa.hibernate.ddl-auto=update

它们都有效。如果您想知道为什么 noneupdate 都有效,这里是 why

【讨论】:

    猜你喜欢
    • 2023-02-09
    • 2023-03-18
    • 1970-01-01
    • 2018-11-06
    • 2021-05-16
    • 2011-12-04
    • 2010-10-26
    • 2022-12-21
    • 1970-01-01
    相关资源
    最近更新 更多