【发布时间】:2015-01-27 10:47:18
【问题描述】:
在一张很简单的桌子上
CREATE TABLE collectionmaster
(
id character varying(32) NOT NULL,
version integer,
publisherid character varying(12),
title character varying(1024),
subtitle character varying(1024),
type character varying(255) NOT NULL,
CONSTRAINT collectionmaster_pkey PRIMARY KEY (id)
)
WITH (
OIDS=FALSE
);
CREATE INDEX idx_coll_title
ON collectionmaster
USING btree
(title COLLATE pg_catalog."default");
我尝试通过唯一索引添加唯一检查
CREATE UNIQUE INDEX idx_uni_coll_title
ON collectionmaster
USING btree
(publisherid COLLATE pg_catalog."default", title COLLATE pg_catalog."default", (COALESCE(subtitle, 'no_sub'::character varying)) COLLATE pg_catalog."default");
或通过唯一约束
ALTER TABLE collectionmaster
ADD CONSTRAINT uni_coll_title UNIQUE(publisherid, title, subtitle);
拦截在多个线程中执行的 java 服务(休眠时的 spring-jpa)意外多次创建。但奇怪的是,索引和约束都没有按预期工作。八条记录由八个线程添加,这些记录在单独的事务中根据约束或索引都不是唯一的,但不会引发唯一冲突,并且所有记录都插入到表中。并且没有任何值是空的,就像这里其他问题中的问题一样。 约束未被延迟,索引为有效的约束。 Postgres 版本是 9.2。
我在这里一无所知。
编辑:这些是此表中查询的结果,从 pgAdmin 中提取(在这里很难格式化):
"id";"version";"publisherid";"title";"subtitle";"type"
"53b3df625baf40bf885b48daa366fbc8";1;"5109138";"Titel";"Untertitel";"set"
"2673ef9a33f84289995d6f7288f07b46";1;"5109138";"Titel";"Untertitel";"set"
"ef7c385205034fdc89fe39e3eca48408";1;"5109138";"Titel";"Untertitel";"set"
"527922f2f3464f91826dbae2e2b67caf";1;"5109138";"Titel";"Untertitel";"set"
"794638a725324319852d10b828257df7";1;"5109138";"Titel";"Untertitel";"set"
"dbe2201058974d63a2107131f0080233";1;"5109138";"Titel";"Untertitel";"set"
"cbb77c7c1adb415db006853a6f6244ac";1;"5109138";"Titel";"Untertitel";"set"
"0b6606fe015040fbbc85444361ab414c";1;"5109138";"Titel";"Untertitel";"set"
即使在这些上我也可以执行
insert into collectionmaster(id, version, publisherid, title, subtitle, type) values('aaa',1,'5109138','Titel','Untertitel','set')
没有违反约束。我也不敢相信,但这就是问题所在……
【问题讨论】:
-
@a_horse_with_no_name 是的,我是;列中的值在各个方面都是相同的,来自同一个 java 数据对象。
-
那么请向我们展示一些重现此问题的示例数据(最好是
INSERT语句)。鉴于您提供的信息,这很难相信。 -
为我工作:sqlfiddle.com/#!15/999d4/1 你确定你在运行插入的同一个数据库上创建了索引吗?
-
@a_horse_with_no_name 是的,在同一个 pgAdmin SQL 窗口中。更奇怪的是:当我放弃约束并尝试在非唯一数据上重新创建它时,我收到了预期的错误消息,即数据阻止创建。
-
您确定您的 spring-jpa 不想在初始化时“修复”您的架构吗?比如,
spring.jpa.hibernate.ddl-auto设置为update或create-drop? docs.spring.io/spring-boot/docs/current/reference/html/… 我不确定update是否也可以删除不需要的索引,但是您可以使用 pgAdmin 仔细检查一下吗(在您启动应用程序之后)?
标签: postgresql hibernate spring-data-jpa unique-constraint