Как пересортировать 2 связанные по внешнему ключу таблицы?

Модератор: Модераторы

Как пересортировать 2 связанные по внешнему ключу таблицы?

Сообщение OberonAR » 25.02.2012 12:08:57

Поясню: есть таблица s_regioni : id , nazv_reg , s_strani_id и таблица s_starani : id , nazv_strani. Поле s_strani_id ссылается на поле id таблицы s_strani. Мне необходимо отсортировать таблицу s_strani по названию страны в алфавитном порядке. Т.е. id России был например 143, а станет например 120. Соответственно в таблице регионов надо поменять id страны. Проблема в том, что таблиц довольно много у меня в БД. ID страны например есть еще в таблице адресов... Таких сортировок мне необходимо множество. Связанных таблиц в БД больше 200... Может есть какой инструмент для этого, что бы он учитывал внешние ключи? т.е. мне надо поменять id в одной таблице, и на основании допустим внешнего ключа также автоматом поменялись ссылающиеся на этот id другие поляв других таблицах.
Аватара пользователя
OberonAR
новенький
 
Сообщения: 73
Зарегистрирован: 08.02.2012 11:46:04
Откуда: Краснодарский край

Re: Как пересортировать 2 связанные по внешнему ключу таблиц

Сообщение alexs » 25.02.2012 12:44:36

Если я правильно понял - то это должен уметь делать любой приличный SQL сервер сам.
Просто укажи в ограничении внешнего ключа автообновление ключа - и всё.
Пример:
Код: Выделить всё
  ALTER TABLE TB_PROV
     ADD CONSTRAINT FK_TB_PROV FOREIGN KEY (TB_DOC_ID) REFERENCES TB_DOC (TB_DOC_ID)
    ON DELETE CASCADE ON UPDATE CASCADE

В подчинённой таблице проводок внешний ключ на документ. При изменении влюча в документе - в проводке тоже изменится.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Как пересортировать 2 связанные по внешнему ключу таблиц

Сообщение OberonAR » 25.02.2012 15:12:53

Спасибо! Сам же читал про это недавно....
Но вопрос теперь возник другой:
Есть таблица в MySQL:
Код: Выделить всё
CREATE TABLE blanki.lica(
  id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  fam VARCHAR(30) NOT NULL,
  imya VARCHAR(30) NOT NULL,
  otch VARCHAR(30) DEFAULT NULL,
  dr DATE NOT NULL,
  s_pol_id TINYINT(4) UNSIGNED NOT NULL,
  mr VARCHAR(255) NOT NULL,
  s_reg_roj_id SMALLINT(6) UNSIGNED DEFAULT NULL,
  nas_punkti_id INT(11) UNSIGNED DEFAULT NULL COMMENT 'Населенный пункт рождения',
  s_strani_id SMALLINT(6) UNSIGNED NOT NULL COMMENT 'Гражданство',
  s_nacii_id SMALLINT(6) UNSIGNED DEFAULT NULL,
  inn BIGINT(20) UNSIGNED DEFAULT NULL,
  s_obrazovanii_id TINYINT(4) UNSIGNED DEFAULT NULL,
  d_smerti DATE DEFAULT NULL,
  when_vvod DATETIME NOT NULL,
  when_izm DATETIME NOT NULL,
  who_vvod INT(11) UNSIGNED NOT NULL,
  who_izm INT(11) UNSIGNED NOT NULL,
  PRIMARY KEY (id),
  UNIQUE INDEX dr (dr),
  UNIQUE INDEX fam (fam),
  INDEX FK_lica_nas_punkti_id (nas_punkti_id),
  INDEX FK_lica_s_nacii_id (s_nacii_id),
  INDEX FK_lica_s_obrazovanii_id (s_obrazovanii_id),
  INDEX FK_lica_s_pol_id (s_pol_id),
  INDEX FK_lica_s_reg_roj_id (s_reg_roj_id),
  INDEX FK_lica_s_strani_id (s_strani_id),
  UNIQUE INDEX imya (imya),
  UNIQUE INDEX mr (mr),
  UNIQUE INDEX otch (otch),
  CONSTRAINT FK_lica_nas_punkti_id FOREIGN KEY (nas_punkti_id)
  REFERENCES blanki.nas_punkti (id) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT FK_lica_s_nacii_id FOREIGN KEY (s_nacii_id)
  REFERENCES blanki.s_nacii (id) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT FK_lica_s_obrazovanii_id FOREIGN KEY (s_obrazovanii_id)
  REFERENCES blanki.s_obrazovanii (id) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT FK_lica_s_pol_id FOREIGN KEY (s_pol_id)
  REFERENCES blanki.s_pol (id) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT FK_lica_s_reg_roj_id FOREIGN KEY (s_reg_roj_id)
  REFERENCES blanki.s_reg_roj (id) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT FK_lica_s_strani_id FOREIGN KEY (s_strani_id)
  REFERENCES blanki.s_strani (id) ON DELETE CASCADE ON UPDATE CASCADE
)
ENGINE = INNODB
AUTO_INCREMENT = 1
CHARACTER SET utf8
COLLATE utf8_general_ci;


Пытаюсь проверить. В этой таблице есть запись с s_strani_id=143 - под таким кодом в справочнике государств (s_strani) у меня значится Россия. Пытаюсь поменять в этом справочнике id России на другое число (ну допустим 800), на что dbForge Studio выдает:
error.jpg

Видимо не дочитался я все таки чего-то. Что-то наверное путаю.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
OberonAR
новенький
 
Сообщения: 73
Зарегистрирован: 08.02.2012 11:46:04
Откуда: Краснодарский край

Re: Как пересортировать 2 связанные по внешнему ключу таблиц

Сообщение alexs » 25.02.2012 23:24:30

При создании внешнего ключа на update явно повесли restrict.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Как пересортировать 2 связанные по внешнему ключу таблиц

Сообщение OberonAR » 26.02.2012 10:55:08

Спасибо за подсказку! У меня еще есть таблица регионов, а вот там тоже был внешний ключ на id страны с restrict.
Делал диаграмму БД в dbForge Studio, так вот в диаграме при просмотре внешнего ключа стояло CASCADE, вот я и думал что все в порядке, а когда открыл саму таблицу на редактирование там было restrict. Исправил, и все заработало! Еще раз спасибо! А то бы долго ковырялся в диаграмме...
Аватара пользователя
OberonAR
новенький
 
Сообщения: 73
Зарегистрирован: 08.02.2012 11:46:04
Откуда: Краснодарский край


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru