java - 在 MyBatis 中添加一个项目列表,在 SQL 列中共享一个值

标签 java sql postgresql hsqldb mybatis

我有一个 List<MyItem>我想通过 插入到一张 table :

CREATE TABLE activities (
  id  BIGINT GENERATED BY DEFAULT AS IDENTITY,
  group_id  BIGINT NOT NULL,
  name VARCHAR(64),
  CONSTRAINT pk_activities PRIMARY KEY (id)
);
  • id是自动生成的/唯一的
  • group_id根据 List<> 应该是唯一的
  • name只是 MyItem 的属性

当我插入它们时,我想要 数据库使所有插入的项目共享相同的(但在数据库中是唯一的)group_id值(value)。

这在单个 insert 中是否可能?操作? 如果不是 - 是否有可能在 2,3.. 中?

我强烈强调一个事实,无论是 MyBatis 还是数据库本身(通过 SQL)都可以完成我正在寻找的事情

最佳答案

您可以使用独立的 SEQUENCE为此:

CREATE SEQUENCE activities_group_id;

甚至将它与列相关联,用于文档,以便它与表一起删除:

ALTER SEQUENCE activities_group_id OWNED BY activities.group_id;

与您的常规序列(如 serial or bigserial)的唯一区别列会自动创建:activities.group_id 没有默认列。
那么你的 SQL 命令可能是:

WITH g AS (SELECT nextval('activities_group_id') AS group_id)
INSERT INTO activities (group_id, name)
SELECT group_id, unnest(ARRAY['foo','bar','baz']) FROM g

更新:
ARRAY['foo','bar','baz'] 是您的项目(名称)数组。
现在使用 ARRAY 构造函数而不是 PostgreSQL 特定类型转换 '{foo, bar,baz}'::text[]

data-modifying CTE 需要 PostgreSQL 9.1 或更高版本.我用它来避免多次 nextval() 调用。我们想要一个电话。

顺便说一句,我(或 PostgreSQL)不知道您的 CREATE 脚本中的语法。我原以为会是:

CREATE TABLE activities (
  id  bigserial PRIMARY KEY,
  group_id  bigint NOT NULL,
  name  varchar(64)
);

关于java - 在 MyBatis 中添加一个项目列表,在 SQL 列中共享一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15783896/

相关文章:

sql - 在日期(无时间)上处理 SQL 查询的最佳方法是什么?

sql - PostgreSQL 驱动程序在某些 SQL 语句上附加隐藏字符

python - 在 python 中声明 "MUL key"字段。 (django 框架)

node.js - sql_error_code = 28000 FATAL 登录工作 API

mysql - 在 MySQL 中使用 IF ELSE 条件更新同一个表

java - 单例模式是 RedissonClient 的一个很好的用例吗?

java - 从哪里可以获得 EWS JAVA API 2.0?

java - 国际化(语言环境)在 java spring boot 中不使用重音符号

java - 为什么在while循环中等待Condition?

mysql - 在 SQL 中使用基于 Char 的科学记数法过滤行