Можно ли правильно заполнить новое поле таблицы данными из другой таблицы?

Конечная цель заключается в добавлении нового поля-внешнего ключа с именем `TableBId` к таблице `TableA`. Это поле должно ссылаться на соответствующий `Id` из таблицы `TableB`, основываясь на соответствии значений поля `Name`. Затем после установления всех связей между таблицами, поле `Name` из таблицы `TableA` можно удалить. Для достижения данной цели необходимо составить скрипт, который осуществит это действие. Как реализовать подобный механизм?
  • 19 февраля 2024 г. 14:18
Ответы на вопрос 2
Да, можно правильно заполнить новое поле таблицы данными из другой таблицы. Для этого можно воспользоваться следующим скриптом на SQL:

```sql
-- Добавляем новое поле TableBId к таблице TableA
ALTER TABLE TableA
ADD TableBId INT; -- Или любой другой тип данных, соответствующий полю Id из таблицы TableB

-- Обновляем новое поле TableBId в таблице TableA на основе данных из таблицы TableB
UPDATE TableA
SET TableBId = TableB.Id
FROM TableA
JOIN TableB ON TableA.Name = TableB.Name;

-- Добавляем внешний ключ к таблице TableA, ссылающийся на поле Id таблицы TableB
ALTER TABLE TableA
ADD CONSTRAINT FK_TableBId
FOREIGN KEY (TableBId)
REFERENCES TableB(Id);

-- Удаляем поле Name из таблицы TableA
ALTER TABLE TableA
DROP COLUMN Name;
```

Этот скрипт добавляет новое поле `TableBId` к таблице `TableA`, заполняет его данными из таблицы `TableB` на основе совпадения значений поля `Name`, добавляет внешний ключ, который ссылается на поле `Id` таблицы `TableB`, и, наконец, удаляет поле `Name` из таблицы `TableA`.
Сначала создаёте новое поле. Следующим действием делаете Update таблицы TableA. 
Про update читайте здесь: https://www.postgresql.org/docs/16/sql-update.html
Обратите внимание на вариант update from.
Результат не может быть полностью верным если в TableB поле Name неуникально, что по описанию таблицы возможно.
Похожие вопросы