Ограничение внешнего ключа не существует ОШИБКА - PullRequest
0 голосов
/ 11 января 2020

Я получаю эту ошибку в своей базе данных psql;

bikefacility=# ERROR:  syntax error at or near "c"
bikefacility-# LINE 1: c
bikefacility-#         ^
bikefacility-# bikefacility=# ALTER TABLE bicycle ADD CONSTRAINT fk_maintenance_contact_person FOREIGN KEY (maintenance_contact_person) REFERENCES maintenance(maintenance_contact_person);
ERROR:  syntax error at or near "ERROR"
LINE 1: ERROR:  syntax error at or near "c"
        ^
bikefacility=# ERROR:  column "maintenance_contact_person" referenced in foreign key constraint does not exist
bikefacility-# bikefacility=# ALTER TABLE bicycle ADD CONSTRAINT fk_rental_period FOREIGN KEY (rental_period) REFERENCES rental(rental_period);
ERROR:  syntax error at or near "ERROR"
LINE 1: ERROR:  column "maintenance_contact_person" referenced in fo...
        ^
bikefacility=# ERROR:  column "rental_period" referenced in foreign key constraint does not exist
bikefacility-# bikefacility=# ALTER TABLE bicycle ADD CONSTRAINT fk_terminal_id FOREIGN KEY (terminal_id) REFERENCES terminal(terminal_id);
ERROR:  syntax error at or near "ERROR"
LINE 1: ERROR:  column "rental_period" referenced in foreign key con...
        ^
bikefacility=# ERROR:  column "terminal_id" referenced in foreign key constraint does not exist

Это мой код. Я создал такой же стиль внешних ключей в коде, как вы можете видеть здесь.

CREATE TABLE member (
  member_id INTEGER PRIMARY KEY,
  member_fname VARCHAR(15) NOT NULL,
  member_lname VARCHAR(15) NOT NULL,
  member_status VARCHAR(15) NOT NULL,
  member_address VARCHAR(10) NOT NULL,
  member_email VARCHAR(30) NOT NULL
);

CREATE TABLE bicycle (
  bicycle_id INTEGER PRIMARY KEY,
  bicycle_brand VARCHAR(25) NOT NULL,
  bicycle_model VARCHAR(25) NOT NULL,
  bicycle_colour VARCHAR(15) NOT NULL,
  bicycle_type VARCHAR(20) NOT NULL,
  bicycle_size VARCHAR(10) NOT NULL,
  bicycle_availability VARCHAR(20) NOT NULL

);

ALTER TABLE bicycle ADD CONSTRAINT fk_bicycle_pickup_date FOREIGN KEY (bicycle_pickup_date) REFERENCES rental(bicycle_pickup_date) >MATCH FULL;
ALTER TABLE bicycle ADD CONSTRAINT fk_maintenance_contact_person FOREIGN KEY (maintenance_contact_person) REFERENCES maintenance(maintenance_contact_person);
ALTER TABLE bicycle ADD CONSTRAINT fk_terminal_id FOREIGN KEY (terminal_id) REFERENCES terminal(terminal_id);
ALTER TABLE bicycle ADD CONSTRAINT fk_rental_period FOREIGN KEY (rental_period) REFERENCES rental(rental_period);

CREATE TABLE sponsor (
  sponsor_id INTEGER PRIMARY KEY,
  sponsor_name VARCHAR(15) NOT NULL,
  sponsor_contact VARCHAR(30) NOT NULL,
  sponsor_period DATE NOT NULL,
  sponsor_address VARCHAR(50) NOT NULL,
  sponsor_fee DECIMAL (6, 2) NOT NULL
);

CREATE TABLE terminal (
  terminal_id INTEGER PRIMARY KEY,
  terminal_address VARCHAR(50) NOT NULL,
  terminal_minstorage VARCHAR(50) NOT NULL,
  terminal_maxstorage VARCHAR(50) NOT NULL
);

CREATE TABLE rental (
  rental_no INTEGER PRIMARY KEY,
  rental_period DATE NOT NULL,
  bicycle_pickup_date DATE NOT NULL
);



Он говорит, что столбцы не существуют, но я знаю, что они существуют, потому что они прямо там! Кто-нибудь может мне помочь, пожалуйста? Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 11 января 2020

Грамматика внешних ключей неверна для postgresql. Например, ALTER TABLE bicycle ADD CONSTRAINT fk_terminal_id FOREIGN KEY (terminal_id) REFERENCES terminal(terminal_id); требует, чтобы в велосипедах было поле с именем терминал_ид, так как прежний терминал_ид в вашем запросе относится к таблице велосипедов, которая должна ссылаться на терминал_ид в таблице терминалов.

Вот краткое руководство по внешние ключи. https://www.postgresqltutorial.com/postgresql-foreign-key/

С уважением,
Bjarni

0 голосов
/ 11 января 2020

Ваша схема запуталась.

  • Там нет таблицы maintenance, но вы пытаетесь сделать ссылку на нее.
  • Внешняя таблица, такая как rental, должна быть создана до того, как вы сделаете для нее ссылку на fk.
  • Вы должны иметь именованные поля в таблице, из которой вы делаете ссылку. В таблице нет полей bicycle_pickup_date, maintenance_contact_person, terminal_id или rental_period bicycle.
  • Ваши ссылки на fk в общем звучат странно. Вы действительно хотите, чтобы у каждого велосипеда был только один прокат? Может быть, вы имели в виду, что в прокате есть ссылки на один велосипед?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...