Postgres对索引的唯一约束不起作用

时间:2015-01-27 10:47:19

标签: postgresql hibernate spring-data-jpa unique-constraint

在一张非常简单的桌子上

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 on hibernate)意外拦截多次创建。但奇怪的是索引和约束都没有按预期工作。 8个记录由8个线程添加,根据单独事务中的约束或索引,它们不是唯一的,但不会抛出唯一的违规,并且所有记录都将插入到表中。并且没有一个值为null,这里的其他问题也是如此。 constaint没有延迟,索引作为约束有效。 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')

没有获得约束违规。我也不敢相信,但这就是问题......

1 个答案:

答案 0 :(得分:1)

确保您的spring-jpa配置spring.jpa.hibernate.ddl-auto未设置为create-drop

这样,休眠将永远下降&重新创建整个架构,不包含自定义的唯一约束,也不包含索引。