Как написать скрипты миграции cratedb? Скрипты миграции не работают
У нас есть база данных, в которой есть таблица "Студенты" с колонками id, name, age, school.
Теперь я хочу написать скрипт миграции, чтобы скопировать 3 столбца (предположим, у меня есть миллионы записей) из таблицы "Студенты" в таблицу "New_students".
Ниже приведен пример сценария, который я написал. Это выбрасывает ошибку
CREATE TABLE IF NOT EXISTS New_Students (
id PRIMARY KEY,
name string,
age string,
)
INSERT INTO New_Students(id,name,age)
SELECT id,name,age
FROM students;
При выполнении выше в пользовательском интерфейсе администратора crateDb я получаю ошибку ниже
SQLActionException[SQLParseException: line 8:1: mismatched input 'INSERT' expecting <EOF>]
Вышеприведенные утверждения работают при выполнении индивидуально.
Вопрос:
- Почему выше несколько операторов не работают, но это работает, когда набирается индивидуально? 2. Как сделать, чтобы мы скопировали данные из столбцов таблицы в другую новую таблицу. Допустим, у меня есть миллионы записей, как мне сделать это более эффективно?
4 ответа
Консоль SQL интерфейса администратора CrateDB не поддерживает несколько операторов.
Вы могли бы использовать crash
Вместо этого инструмент CLI, который поддерживает несколько операторов, см. https://crate.io/docs/clients/crash/en/latest/.
Поставить точку с запятой после создания таблицы
CREATE TABLE IF NOT EXISTS New_Students (
id int PRIMARY KEY,
name varchar(100),
age varchar(100) -- you need to remove this line coma as well
);
INSERT INTO New_Students(id,name,age)
SELECT id,name,age
FROM students;
В одном запросе есть только 1 оператор, так как вы говорите, что он работает, когда вы разделяете запросы, поэтому вам нужно сделать два оператора.
Даже с миллионами записей это все равно одно утверждение, так что не должно иметь значения эффективность? Вы только запускаете еще 1 отдельный сценарий для создания новой таблицы, вставка будет работать, как и ожидалось, сколько бы времени это ни заняло.
Почему бы просто не создать таблицу непосредственно из данных?
CREATE TABLE New_Students as
SELECT id, name, age
FROM students;
Ваша проблема в интерфейсе, который позволяет отправлять только выписки одновременно. Однако в этом случае вам могут не понадобиться два утверждения.