Обновление данных до нового внешнего целочисленного ключа

#sql #sql-update #foreign-keys

#sql #sql-обновление #внешние ключи

Вопрос:

У меня есть несколько таблиц с такими данными, как

  • Company (compid, имя, адрес)
  • Country (идентификатор страны, имя)

Каждая компания работает в стране, и существует таблица Being (compid, countryid) с 2 внешними ключами.

Текущие compid/countryid имеют тип varchar , поэтому мне нужно добавить новый целочисленный ключ к company/country

Как только это будет сделано, я хочу обновить таблицу ‘being’ двумя новыми целочисленными столбцами, скажем compid_int , countryid_int .

Я хочу сопоставить новый целочисленный идентификатор из company и country с новыми столбцами в being таблице, а затем установить его в качестве внешнего ключа. Сопоставление будет основано на предыдущих varchar ключах.

Как это можно сделать?

 UPDATE being
SET being.compid_int = company.compid_int
FROM being, company
WHERE being.compid = company.compid;

UPDATE being
SET being.countryid_int = country.countryid_int
FROM being, country
WHERE being.countryid = country.countryid;
 

Это сработает?

Тогда мне нужно будет изменить внешний ключ и удалить старые столбцы во всех 3 таблицах?

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

1. » Это сработает? » — разве вы не пробовали?

2. Какую СУБД вы используете? (Это ОБНОВЛЕНИЕ ИЗ синтаксиса зависит от продукта.)

3. Вредные привычки: использование объединений в старом стиле — этот стиль списка таблиц, разделенных запятыми , в старом стиле был заменен соответствующим JOIN синтаксисом ANSI в стандарте SQL ANSI- 92 ( более 25 лет назад), и его использование не рекомендуется

4. Пожалуйста, укажите в своем вопросе базу данных, которую вы используете: mysql, oracle, postgres …?

Ответ №1:

Вы можете достичь желаемого результата с помощью стандартного SQL в одном UPDATE операторе следующим образом:

 UPDATE BEING B
   SET B.COMPID_INT = (
    SELECT C.COMPID_INT
      FROM COMPANY C
     WHERE B.COMPID = C.COMPID),
       B.COUNTRYID_INT = (
              SELECT C.COUNTRYID_INT
                FROM COUNTRY C
               WHERE B.COUNTRYID = C.COUNTRYID
          );