169 похожих чатов

У меня вопрос по миграции в Room. Для сложных миграций

я создаю новую таблицу, копирую в нее данные, стираю старую и переименовываю новую таблицу на нужную. Команда копирования данных у меня такая:
database.execSQL("""
INSERT INTO new_Notes (id, text, date)
SELECT id, text, date FROM Notes
""".trimIndent())
Тут у меня вопрос: эта команда работает, только если совпадает количество и типы данных полей таблиц? Добавление нового столбца, например, лучше в конце сделать через ALTER или все же можно тут в запросе использовать разное количество полей? Мне просто интересно, как оно вообще копирует данные и что будет, если порядок и/или количество столбцов будет отличаться.

8 ответов

5 просмотров

Вы читали статью по автомиграциям на медиуме и Гугле? Тут вообще ничего сложного в вашем случае.

Viktor- Автор вопроса

Автомиграции тут не вариант, у меня слишком много изменений. Меня интересует конкретный вопрос.

Любой sql insert вставляет в поля написанные слева направо то, что даёт селект также слева направо

Viktor- Автор вопроса

1. То есть тогда новый столбец лучше через обычный ALTER? 2. А каким образом он обработает ситуацию, если в столбцах окажутся разные типы? Попытается конвертнуть и если не удастся, то крашнет приложение с неудачной миграцией?

Ошибка будет если не сможет вставить. Если новый столбец является required то в него и в селекте можно передать сразу значение или применить вложенный селект, разные варианты есть. Если не обязательное поле то проще оставить его не тронутым, будет без значения до поры до времени.

Viktor- Автор вопроса

Понял, спасибо)

В одноименных столбцах не должны быть разные типы. А если так получилось то в селекте же можно сразу функцию конвертации использовать

Viktor- Автор вопроса

Я пойду снова перечитывать инфу по SQL лучше) про конвертацию я вообще пока не в курсе. А насчёт " в одноименных столбцах не должны быть разные типы" - может и так, но судя по примеру из мануала - как минимум примитивы вроде int и string он без проблем с помощью insert поменяет.

Похожие вопросы

Обсуждают сегодня

Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
55
подскажите пожалуйста, как мне освободить результат записанный в переменную result? в чем проблема подскажите если МОЖЕТЕ?
Михаил Helper
28
вопрос по москвину - не понимаю вот такого вопроса похоже Сколько разных всегда завершающихся функций с типом a -> a -> b -> a -> a можно реализовать? Две функции одинаково...
Fedor
11
Слушайте, ещё такая интересная задачка. Сделан аудит действий пользователей через триггеры в базе, соответственно каждый пользователь имеет свой логин и пароль в базе. Это пре...
Сергей Бычков
11
есть тут кто-то , кто только начал изучать си? если проходите курс на степике или как-то сами изучаете, пишите, может, скооперируемся?..
Eule
25
Скажите, тут нет проблемы? IMyInterface1 = interface function GetInterface2: IInterface2; ... function TMyInterface.GetInterface2: IInterface2; begin Result := TI...
Ruslan aka DUDE
18
Утра доброго. Просветите пожалуйста. Хочу сделать rest сервер на делфи. Посмотрел 3 фреймворка: dmvc, Mars, mormot. Ни в одном из них не упоминается ассинхронная обработка вхо...
Сергей Бычков
10
возможно для форматирования TimeStampZ нужен другой механизм, не?
Роман Лях (rgreat)
13
вопрос странный немного... в секции interface идёт константа const TableExt: array [0..39] of record _type: byte; _ext : string; end = ( (_type:typeDAT ...
Alexey Kulakov
5
Всем привет! Помогите разобраться с Lazarus. Переношу программу с Delphi 10.2 Tokyo на Lazarus 3.2. У меня есть строка string которая изначально имеет такое содержание (то чт...
Дмитрий Завгородний
4
Карта сайта