错误:具有FK时没有唯一约束匹配

时间:2019-03-15 09:15:13

标签: sql postgresql

我有三个链接在一起的表

Table

我的脚本:

-- Ticket --
CREATE TABLE public.ticket (
    id bigint NOT NULL,
    libelle character varying(255) NOT NULL,
    description character varying(255) NOT NULL,
    status character varying(255) NOT NULL,
    date_creation timestamp NOT NULL,
    date_modification timestamp NOT NULL,
    user_createur_id bigint,
    referent_realisateur_id bigint,
    CONSTRAINT pk_ticket PRIMARY KEY (id)

);
-- Ticket_Avance TABLE --
CREATE TABLE public.ticket_avance (
    id bigint NOT NULL,
    date_livraison_souhaite timestamp NOT NULL,
    date_engagement_livraison timestamp NOT NULL,
    referent_demandeur_id bigint
);

ALTER TABLE public.ticket_avance ADD CONSTRAINT "fk_ticket_ticketAvance" FOREIGN KEY (id)
REFERENCES public.ticket (id) MATCH SIMPLE
ON DELETE NO ACTION ON UPDATE NO ACTION;

-- Demande_Travaux TABLE --
DROP TABLE IF EXISTS public.demande_travaux CASCADE;
CREATE TABLE public.demande_travaux (
    id bigint NOT NULL,
    contrat_id bigint
);      
ALTER TABLE public.demande_travaux ADD CONSTRAINT "fk_ticketAvance_DDT" FOREIGN KEY (id)
REFERENCES public.ticket_avance (id) MATCH FULL
ON DELETE NO ACTION ON UPDATE NO ACTION;

在创建demand_travaux时出现此错误

SQL Error [42830]: ERROR: there is no unique constraint matching given keys for referenced table "ticket_avance"
  ERROR: there is no unique constraint matching given keys for referenced table "ticket_avance"
  ERROR: there is no unique constraint matching given keys for referenced table "ticket_avance"

3 个答案:

答案 0 :(得分:2)

您忘记将表ID中的列ticket_avance声明为主键。 请使用以下SQL:

-- Ticket_Avance TABLE --
CREATE TABLE public.ticket_avance (
    id bigint NOT NULL,
    date_livraison_souhaite timestamp NOT NULL,
    date_engagement_livraison timestamp NOT NULL,
    referent_demandeur_id bigint,
    CONSTRAINT pk_avance PRIMARY KEY (id) --- add this
);

答案 1 :(得分:1)

您需要在Ticket_Avance表中添加约束,因为您将此ID提供给demande_travaux

-- Ticket_Avance TABLE --
CREATE TABLE ticket_avance (
    id bigint NOT NULL,
    date_livraison_souhaite timestamp NOT NULL,
    date_engagement_livraison timestamp NOT NULL,
    referent_demandeur_id bigint,
    CONSTRAINT pk_ticket_avance PRIMARY KEY (id) //constraint that you need
);

ALTER TABLE demande_travaux ADD CONSTRAINT "fk_ticketAvance_DDT" FOREIGN KEY (id)
REFERENCES ticket_avance (id) MATCH FULL
ON DELETE NO ACTION ON UPDATE NO ACTION;

here is the demo link of your full query

答案 2 :(得分:1)

外键约束必须以主键或唯一约束为目标。数据库必须能够识别“父”表中的一行。

您可以添加主键约束:

ALTER TABLE public.ticket_avance ADD PRIMARY KEY (id);

此外,您应该在定义外键的列上有一个索引,尤其是在您计划删除父行时。使用上面的主键,您在id上有这样的索引,但是您也应该在demande_travaux上有一个索引。 最简单的方法是也将id定义为主键:

ALTER TABLE public.demande_travaux ADD PRIMARY KEY (id);