#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;
… вот таким образом мне был задан этот вопрос
с моей точки зрения, это слабое оправдание. Вы не должны делать это неправильно только потому, что кто — то вам так сказал-объясните им, что то, чего они хотели, неправильно и должно быть изменено.