1

我有一个List<MyItem>我想通过插入到表中:

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值。

这可以在一次insert操作中实现吗? 如果不是 - 是否有可能在 2,3.. 中?

我强烈强调一个事实,即 MyBatis 或数据库本身(通过 SQL)可以做我正在寻找的事情

4

1 回答 1

2

你可以使用一个独立SEQUENCE的:

CREATE SEQUENCE activities_group_id;

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

ALTER SEQUENCE activities_group_id OWNED BY activities.group_id;

与常规序列(如 aserialbigserial列)的唯一区别将自动创建:没有列默认为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 构造函数而不是 PostgreSQL 特定类型转换ARRAY['foo','bar','baz']
'{foo, bar,baz}'::text[]

这需要 PostgreSQL 9.1 或更高版本的数据修改 CTE。我用它来避免多次nextval()通话。我们想要一个电话。

CREATE顺便说一句,我(或 PostgreSQL)不知道你脚本中的语法。我本来希望是:

CREATE TABLE activities (
  id  bigserial PRIMARY KEY,
  group_id  bigint NOT NULL,
  name  varchar(64)
);
于 2013-04-03T11:03:01.567 回答