postgresql - 为什么我不能在 PostgreSQL 中设置这个唯一约束?

标签 postgresql constraints unique-constraint unique-key

我不断得到:

SQL error: ERROR: could not create unique index "service_import_checksum_key" DETAIL: Key (checksum)=() is duplicated.

声明中:

ALTER TABLE "public"."service_import" ADD CONSTRAINT "service_import_checksum_key" UNIQUE ("checksum")

但是这个约束不是重复的。在整个数据库中的任何地方都没有像这样的其他约束,我不知道为什么它一直坚持它是重复的。我假设这是我在这里遗漏的 postgres 的一些奇怪的细微差别。

我做错了什么?

表转储:

--
-- PostgreSQL database dump
--

SET statement_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = off;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET escape_string_warning = off;

SET search_path = public, pg_catalog;

SET default_tablespace = '';

SET default_with_oids = false;

--
-- Name: service_import; Type: TABLE; Schema: public; Owner: cvs_tar; Tablespace: 
--

CREATE TABLE service_import (
    id integer NOT NULL,
    name character varying(32) NOT NULL,
    importfile character varying(64) NOT NULL,
    reportfile character varying(64) NOT NULL,
    percent smallint NOT NULL,
    message text NOT NULL,
    stamp timestamp without time zone DEFAULT now() NOT NULL,
    complete smallint DEFAULT 0 NOT NULL,
    checksum character varying(40) NOT NULL
);


ALTER TABLE public.service_import OWNER TO cvs_tar;

--
-- Name: service_imports_id_seq; Type: SEQUENCE; Schema: public; Owner: cvs_tar
--

CREATE SEQUENCE service_imports_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;


ALTER TABLE public.service_imports_id_seq OWNER TO cvs_tar;

--
-- Name: service_imports_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: cvs_tar
--

ALTER SEQUENCE service_imports_id_seq OWNED BY service_import.id;


--
-- Name: id; Type: DEFAULT; Schema: public; Owner: cvs_tar
--

ALTER TABLE service_import ALTER COLUMN id SET DEFAULT nextval('service_imports_id_seq'::regclass);


--
-- Name: service_import_name_key; Type: CONSTRAINT; Schema: public; Owner: cvs_tar; Tablespace: 
--

ALTER TABLE ONLY service_import
    ADD CONSTRAINT service_import_name_key UNIQUE (name);


--
-- Name: service_import_pkey; Type: CONSTRAINT; Schema: public; Owner: cvs_tar; Tablespace: 
--

ALTER TABLE ONLY service_import
    ADD CONSTRAINT service_import_pkey PRIMARY KEY (id);


--
-- Name: service_import_complete_idx; Type: INDEX; Schema: public; Owner: cvs_tar; Tablespace: 
--

CREATE INDEX service_import_complete_idx ON service_import USING btree (complete);


--
-- Name: service_import_stamp_idx; Type: INDEX; Schema: public; Owner: cvs_tar; Tablespace: 
--

CREATE INDEX service_import_stamp_idx ON service_import USING btree (stamp);


--
-- PostgreSQL database dump complete
--

最佳答案

再次阅读错误信息:

SQL error: ERROR: could not create unique index "service_import_checksum_key" DETAIL: Key (checksum)=() is duplicated.

它似乎在告诉您 checksum 列中存在重复值,并且您正在尝试使用您的约束对该列强制执行唯一性。约束没有重复,数据有重复。

此外,“()”部分表示您在 checksum 列中有多个空字符串。唯一约束允许多个 NULL 值(因为 NULL = NULLNULL 这不是真的)但空字符串不是 NULL.

一个例子来阐明发生了什么:

=> CREATE TABLE x (s VARCHAR NULL);
CREATE TABLE
=> INSERT INTO x (s) VALUES (''), ('a'), ('');
INSERT 0 3
=> ALTER TABLE x ADD CONSTRAINT ux UNIQUE(s);
NOTICE:  ALTER TABLE / ADD UNIQUE will create implicit index "ux" for table "x"
ERROR:  could not create unique index "ux"
DETAIL:  Key (s)=() is duplicated.
=> delete from x where s='';
DELETE 2
=> INSERT INTO x (s) VALUES ('a');
INSERT 0 1
=> ALTER TABLE x ADD CONSTRAINT ux UNIQUE(s);
NOTICE:  ALTER TABLE / ADD UNIQUE will create implicit index "ux" for table "x"
ERROR:  could not create unique index "ux"
DETAIL:  Key (s)=(a) is duplicated.

特别注意ERRORDETAIL 的内容,并将其与 INSERT 进行比较。

关于postgresql - 为什么我不能在 PostgreSQL 中设置这个唯一约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5086326/

相关文章:

java - JAX-RS 表单验证 - 突出显示输入文本字段并显示验证消息

postgresql - 如何将更严格的函数转换为聚合

sql - 如何获取不带引号的 JSON 属性?

SQL - 如何从两个表中获取数据

swift - 如何在 Swift 中设置约束的优先级?

ios - 定位约束没有任何影响

sql - 添加唯一约束但忽略现有表数据

entity-framework - 实体数据模型,唯一索引

MySQL:如何根据另一列创建唯一标识符

sql - 如何阻止 postgres 表有重复记录,而是将重复记录写入另一个表