Слабая сущность postgresql - PullRequest
0 голосов
/ 09 мая 2020

Я хочу создать таблицу с первичным ключом email,nro, являющимся nro порядковым номером для каждого 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)

1 Ответ

0 голосов
/ 09 мая 2020

Здесь две вещи, которые помогут решить вашу проблему:

  1. Почему nro равно serial, если в вашей базе данных не является последовательным полем? Тип serial используется, когда вы хотите, чтобы поле увеличивалось автоматически (как в первичных ключах с одним целым числом). Может быть, лучше указать здесь тип 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);

Итак, я могу сделать вывод, что когда вы хотите добавить ограничение, ваша база данных уже имеет дублированные данные в эти две колонки. Попробуйте создать в тестовой базе данных упомянутые выше данные, и вы увидите, что все работает отлично.

Я только что снял ограничение внешнего ключа, чтобы разрешить запуск кода, поскольку в примере у нас нет указанной таблицы, и мы можем считать, что указанная таблица не влияет на проблему, указанную в ответе.

Вот скрипка .

...