【问题标题】:Weak Entity postgresql弱实体postgresql
【发布时间】:2026-02-05 13:30:01
【问题描述】:

我想创建一个主键email,nronro 的表,每个email 的序号为:

user1@e.com, 1 
user1@e.com, 2
user2@e.com, 1 
create table proposta_de_correcao(
    email varchar(255) not null,
    nro serial not null,
    unique(nro,email),
    PRIMARY KEY(nro, email),
    FOREIGN KEY (email) REFERENCES Utilizador(email),
);

但我收到以下错误:

ERROR: there is no unique constraint matching given keys for referenced table "proposta_de_correcao"

我已经试过了:

unique(nro,email)
contraint keys unique(nro,email)

【问题讨论】:

    标签: postgresql create-table unique-constraint weak-entity


    【解决方案1】:

    这里有两件事可以帮助您解决问题:

    1. 如果nro 不是数据库中的顺序字段,为什么serialserial 类型用于您希望字段自动递增(如在单个整数主键中)。在这里输入int 可能会更好。

    2. 您的表中没有唯一约束。如果你创建一个小提琴,你可以看到代码运行良好:

        CREATE TABLE proposta_de_correcao(
            email VARCHAR(255) not null,
            nro SERIAL not null,
            UNIQUE(nro, email),
            PRIMARY KEY(nro, email)
            -- FOREIGN KEY (email) REFERENCES Utilizador(email)
        );
    
        INSERT INTO proposta_de_correcao VALUES ('user1@e.com', 1);
        INSERT INTO proposta_de_correcao VALUES ('user1@e.com', 2);
        INSERT INTO proposta_de_correcao VALUES ('user2@e.com', 1);
    

    因此,我可以得出结论,当您要添加约束时,您的数据库在这两列中已经有重复的数据。尝试在测试数据库中创建上面提到的数据,你会看到它运行得很好。

    我刚刚删除了外键约束以允许运行代码,因为我们在示例中没有引用的表,我们可以认为引用的表对答案中引用的问题没有影响。

    这是fiddle

    【讨论】: