Продолжайте получать ошибку SQL : ORA-02270: нет совпадающего уникального или первичного ключа для этого списка столбцов

#sql #database #oracle #database-design #primary-key

#sql #База данных #Oracle #проектирование базы данных #первичный ключ

Вопрос:

У меня есть следующие таблицы:

 CREATE TABLE PROPERTY   (PropertyID SMALLINT PRIMARY KEY,   Location VARCHAR(10),   )  CREATE TABLE OFFICE   (OfficeID SMALLINT,   PersonID SMALLINT,   Area VARCHAR(5),   PRIMARY KEY(OfficeID, PersonID)   )  

Теперь я хочу создать следующую таблицу, но я продолжаю получать указанную ошибку (ORA-02270: нет совпадающего уникального или первичного ключа для этого списка столбцов).

 CREATE TABLE FOR_RENT   (PropertyID SMALLINT,   OfficeID SMALLINT,   FOREIGN KEY(PropertyID) REFERENCES PROPERTY(PropertyID),   FOREIGN KEY(OfficeID) REFERENCES OFFICE(OfficeID),   PRIMARY KEY(PropertyID, OfficeID)   )  

Я хочу, чтобы в таблице в качестве внешних ключей FOR_RENT были указаны идентификаторы свойств и OfficeId, но, поскольку OfficeId является составным ключом в Office таблице, я полагаю, что получаю ошибку. Как мне это исправить? Любой вклад был бы великолепен

Комментарии:

1. Почему это PersonID часть первичного ключа для вашей OFFICE таблицы? Должен ли этот столбец (для чего бы он ни предназначался) быть просто внешним ключом к таблице person?

2. PersonID-мой первичный ключ, потому что только OfficeId будет повторяться. В одном офисе может быть много людей.

3. Конечно, вам нужен стол только для офисов, а затем еще один стол, который связывает людей с офисами? Или, возможно, столбец office в таблице person, если каждый сотрудник может быть назначен только в один офис одновременно?

4. Ну, я не могу … Вот как мне был задан этот вопрос. Есть ли способ исправить мою проблему, если я этого не изменю?

5. Ваш внешний ключ должен был бы ссылаться на оба столбца в соответствующем первичном ключе; поэтому вам снова потребуется (или) человек в таблице for_rent — больше избыточных данных, что затрудняет обновление. Что не кажется идеальным…

Ответ №1:

Как прокомментировал Алекс, это, скорее всего, неправильная модель данных. Должно было быть что-то вроде этого:

 SQLgt; CREATE TABLE property  2 (  3 propertyid SMALLINT PRIMARY KEY,  4 location VARCHAR (10)  5 );  Table created.  SQLgt; CREATE TABLE person  2 (  3 personid SMALLINT PRIMARY KEY,  4 name VARCHAR2 (20)  5 );  Table created.  SQLgt; CREATE TABLE office  2 (  3 officeid SMALLINT PRIMARY KEY,  4 area VARCHAR (5)  5 );  Table created.  SQLgt; -- people work in offices SQLgt; CREATE TABLE person_x_office  2 (  3 personid SMALLINT CONSTRAINT fk_pxo_per REFERENCES person (personid),  4 officeid SMALLINT CONSTRAINT fk_pxo_off REFERENCES office (officeid),  5 CONSTRAINT pk_pxo PRIMARY KEY (personid, officeid)  6 );  Table created.  SQLgt; CREATE TABLE for_rent  2 (  3 propertyid SMALLINT,  4 officeid SMALLINT,  5 FOREIGN KEY (propertyid) REFERENCES property (propertyid),  6 FOREIGN KEY (officeid) REFERENCES office (officeid),  7 PRIMARY KEY (propertyid, officeid)  8 );  Table created.  SQLgt;  

… вот таким образом мне был задан этот вопрос

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