Автоматическое увеличение FK, как оно обновляется? - PullRequest
0 голосов
/ 14 марта 2019

Хорошо, так что я сейчас работаю над Oracle 11G Express Edition для колледжа. Я столкнулся с проблемой автоматического увеличения и обновления в следующей родительской таблице. Так что у меня есть таблица адресов, а затем таблица города, например. Вот адрес кода SQL

create table address(
addressid int primary key,
cityid int,
countyid int,
streetnameid int,
postcodeid int,
doornumid int,
natid int,
foreign key (doornumid) references doornum,
foreign key (postcodeid) references postcode,
foreign key (streetnameid) references streetname,
foreign key (countyid) references county,
foreign key (cityid) references city,
foreign key (natid) references nat);

Итак, как вы можете видеть, я ссылаюсь на таблицу городов как на внешний ключ, и это код таблицы SQL города ниже:

create table city(
cityid int primary key,
city varchar(45));

Код города использует последовательность для автоматического увеличения при вставке материала:

create SEQUENCE seq_cityID
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 11;

Так что я просто автоматически увеличиваю все входные данные на cityid, как это:

INSERT INTO city (cityid, city)
values(seq_cityID.nextval, Oxford);
INSERT INTO city (cityid, city)
values(seq_cityID.nextval, Oxford);

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

INSERT INTO address (addressid, cityid, countyid, streetnameid, postcodeid, doornumid, natid)
values(seq_addressID.nextval, seq_cityID.nextval, seq_countyID.nextval, seq_streetnameID.nextval, seq_postcodeID.nextval, seq_doornumID.nextval, seq_natID.nextval);
INSERT INTO address (addressid, cityid, countyid, streetnameid, postcodeid, doornumid, natid)
values(seq_addressID.nextval, seq_cityID.nextval, seq_countyID.nextval, seq_streetnameID.nextval, seq_postcodeID.nextval, seq_doornumID.nextval, seq_natID.nextval);

Это простая вставка в адрес, который в данный момент ссылается только на nextval, но я не верю, что он извлечет эту строку данных из этого идентификатора. Как эффективно вытащить этот идентификатор из дочерней таблицы и автоматически добавить его в родительский?

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

С вашими исходными таблицами:

declare
  v_countyid     integer;
  v_cityid       integer;
  v_streetnameid integer;
begin
  insert into city (city_name) values ('Saint Petersburg') returning cityid into v_city_d;
  insert into streetname (street_name) values ('Park Drive') returning streetnameid into v_streetnameid;
  ...

  insert into address (cityid, streetnameid, ...) values (v_cityid, v_streetnameid, ...);

  commit;
end;

Но тогда в таблицах будут дубликаты городов, названий улиц и т. Д.Поэтому мы бы предпочли:

declare
  v_countyid     integer;
  v_cityid       integer;
  v_streetnameid integer;
begin
  select cityid into v_cityid from city where city_name = 'Saint Petersburg';

  if cityid is null then
    insert into city (city_name) values ('Saint Petersburg') returning cityid into v_city_d;
  end if;

  select streetnameid into v_streetnameid from streetname where street_name = 'Park Drive';

  if v_streetnameid is null then
    insert into streetname (street_name) values ('Park Drive') returning streetnameid into v_streetnameid;
  end if;
  ...

  insert into address (cityid, streetnameid, ...) values (v_cityid, v_streetnameid, ...);

  commit;
end;

Но, как уже упоминалось в моем другом ответе.Эта модель данных в любом случае не имеет особого смысла.

0 голосов
/ 14 марта 2019

У вас неправильное представление о таблицах и их отношениях.

У вашей модели данных есть одна таблица для всех названий городов, одна для всех названий улиц, одна для всех номеров дверей и т. Д. Но зачем вам таблица?что содержит номера дверей?Что это говорит тебе?Номера дверей не являются сущностью сами по себе;они принадлежат улице.И улицы принадлежат городам.Не было бы смысла искать всех людей, которые живут на какой-то 12 или главной улице.

Одна из возможных моделей данных:

country (country_id, country_name, country_code)
  pk country_id

county (county_id, county_name)
  pk county_id
  fk country_id -> country

city (city_id, city_name, postcode, county_id)
  pk city_id
  fk county_id -> county

street (street_id, street name, city_id)
  pk street_id
  fk city_id -> city

address (address_id, street_id, door_number
  pk address_id
  fk street_id -> street

С помощью этой модели данных мы можем проверить согласованность,Если мы хотим ввести адрес 111 Millstreet, Оксфорд, Италия, база данных сообщит нам, что в Италии нет Оксфорда.Мы также можем легко найти адреса на той же улице (и не так, как «на главной улице пять миллионов адресов», но «800 адресов на главной улице, Огайо»).

Если вы хотите вставить новуюадрес, вы ищите страну, затем округ и т. д., пока не доберетесь до улицы ID.

...