我有一个 List<MyItem>
我想通过 mybatis 插入到一张 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
的属性
当我插入它们时,我想要 mybatis 或数据库使所有插入的项目共享相同的(但在数据库中是唯一的)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/