Слабая сущность postgresql
Я хочу создать таблицу с первичным ключом 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 ответ
Вот две вещи, которые помогут решить вашу проблему:
Почему
nro
являетсяserial
если в вашей базе данных нет последовательного поля?serial
type используется, когда вы хотите, чтобы поле увеличивалось автоматически (как в первичных ключах с одним целым числом). Может, лучше поставитьint
введите здесь.У вас в таблице нет уникальных ограничений. Если вы создадите скрипку, вы увидите, что код работает нормально:
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);
Итак, я могу сделать вывод, что когда вы хотите добавить ограничение, ваша база данных уже имеет дублированные данные в этих двух столбцах. Попробуйте создать в тестовой базе данных упомянутые выше данные, и вы увидите, что все работает отлично.
Я просто удалил ограничение внешнего ключа, чтобы разрешить запуск кода, поскольку в примере у нас нет указанной таблицы, и мы можем считать, что указанная таблица не влияет на проблему, указанную в ответе.
Вот скрипка.