#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
);