Как изменить тип столбца и имеющиеся строки используя данные из другой таблицы?
У меня есть две таблицы: progress и subjects. В progress есть столбец subject типа text, а в таблице subjects есть 2 столбца: subject_id типа integer и subject типа text.
Как мне заменить тип столбца subject в таблице progress на integer, заодно изменив имеющиеся записи в этой таблице?
Пробовал такой вариант (переименовал subject на subject_id для дальнейшего присвоения ему внешнего ключа):
ALTER TABLE progress RENAME COLUMN subject TO subject_id; ALTER TABLE progress ALTER COLUMN subject_id TYPE INTEGER USING ( SELECT subjects.subject_id FROM subjects, progress WHERE progress.subject_id = subjects.subject ); |
ALTER TABLE progress RENAME COLUMN subject TO subject_id; ALTER TABLE progress ALTER COLUMN subject_id TYPE INTEGER USING ( SELECT subjects.subject_id FROM subjects, progress WHERE progress.subject_id = subjects.subject );
но это неправильный запрос:
ОШИБКА: нельзя использовать подзапрос в выражении преобразования
СТРОКА 1: ...ogress ALTER COLUMN subject_id TYPE INTEGER USING (SELECT su...
Дополнительно:
заменить тип столбца subject в таблице progress на integer
Это DDL.
изменив имеющиеся записи в этой таблице
А это DML.
Так что два запроса минимум. Реально - три. Создание нового поля, заполнение его значениями, удаление старого поля.
ALTER TABLE progress ADD COLUMN subject_id INT; UPDATE progress p SET p.subject_id = s.subject_id FROM subjects s WHERE p.subject = s.subject; -- ALTER TABLE progress DROP COLUMN subject; |
ALTER TABLE progress ADD COLUMN subject_id INT; UPDATE progress p SET p.subject_id = s.subject_id FROM subjects s WHERE p.subject = s.subject; -- ALTER TABLE progress DROP COLUMN subject;
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для изменения типа столбца и имеющихся строк, используя данные из другой таблицы, вам потребуется выполнить несколько шагов.
1. Прежде всего, убедитесь, что у вас есть доступ к базе данных и права на изменение структуры таблицы.
2. Создайте новый столбец в вашей таблице с нужным типом данных. Например, если вам нужно изменить тип столбца на INTEGER, используйте следующий SQL запрос:
ALTER TABLE your_table ADD new_column INTEGER;ALTER TABLE your_table ADD new_column INTEGER;
3. Теперь вам нужно обновить новый столбец данными из другой таблицы. Для этого используйте команду UPDATE с JOIN. Например, если у вас есть таблица `table1` с полем `id`, которое соответствует полю `id` в таблице `table2`, и вам нужно скопировать данные из столбца `value` таблицы `table2` в новый столбец `new_column` таблицы `table1`, выполните следующий запрос:
UPDATE table1 JOIN table2 ON table1.id = table2.id SET table1.new_column = table2.value;
4. После того как данные скопированы, вы можете удалить старый столбец, если это необходимо:
ALTER TABLE your_table DROP COLUMN old_column;ALTER TABLE your_table DROP COLUMN old_column;
5. Не забудьте также обновить все запросы и код, которые могут использовать старый тип данных или старый столбец.
Эти шаги помогут вам успешно изменить тип столбца и обновить данные, используя информацию из другой таблицы. Не забудьте сделать резервную копию данных перед внесением изменений, чтобы избежать потери информации.