Переименование таблицы в cockroachdb с динамическим значением

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

Имя текущей таблицы: bla

Имя требуемой таблицы: bla_currentDay

Я пытался что-то вроде этого:

ALTER TABLE bla RENAME TO (SELECT concat('bla',extract('day', CURRENT_DATE)::STRING));

Но я получил ошибку.

invalid syntax: statement ignored: syntax error at or near "("
DETAIL: source SQL:
ALTER TABLE bla RENAME TO (SELECT concat('bla',extract('day', CURRENT_DATE)::STRING))
                          ^
HINT: try \h ALTER TABLE

Это действительно возможно с SQL?


person Christian    schedule 15.10.2019    source источник


Ответы (1)


В настоящее время похоже, что это не поддерживается. Согласно этот комментарий отвечает на вопрос о функции динамического SQL поддерживать

...CockreachDB поддерживает SQL, ожидая, что он будет управляться внешним приложением, написанным на каком-то другом языке программирования (и вы можете создать динамический SQL, как вам нравится, в вашей внешней программе). У нас (пока) нет полноценного языка программирования для базы данных, такого как PL/SQL.

... подразумевая, что вам необходимо соблюдать синтаксис и ограничения типа для name идентификатор, указанный в документах RENAME TABLE.

изменить синтаксис таблицы

Если вы создаете свою таблицу, переименуйте ее извне в оболочка sql, вы можете передать всю команду с помощью флага --execute. Вы можете использовать тот же метод для запуска и получения исходного запроса. Например...

newNameQuery="SELECT concat('bla',extract('day', CURRENT_DATE)::STRING);"

# tail to strip header from scalar, otherwise awk/grep to parse output
newName=`echo $newNameQuery | cockroach sql --certs-dir=$certsDir --host=$host1 | tail -1`

renameQuery="ALTER TABLE bla RENAME TO $newName;"

echo $renameQuery | cockroach sql --certs-dir=$certsDir --host=$host1

... если вам нравится пример быстрого и грязного удара.


Однако, если вы действительно хотите сделать все это в сеансе интегрированной оболочки ... состязательное чтение документация клиента покажет утилиты \! и \|. Это позволяет вам передавать строки обратно вашему клиенту для выполнения в исходной оболочке и при необходимости передавать результаты обратно в оболочку sql.

Вы можете объединить длинную общую строку в клиенте sql и использовать эти флаги для жонглирования вперед и назад по мере необходимости, пока не будет найдена строка ALTER TABLE..., которую сервер CockroachDB сможет корректно интерпретировать. Если бы я был достаточно педантичен, чтобы указать, как это может выглядеть в вашем случае, я мог бы привести пример, подобный следующему...

[1028 16:19:36+0000 ~]$ cockroach sql --certs-dir=$CERTS_DIR --host=$HOST_1
# Welcome to the cockroach SQL interface.
# All statements must be terminated by a semicolon.
# To exit: CTRL + D.
#
# Server version: CockroachDB CCL v19.1.4 (x86_64-unknown-linux-gnu, built 2019/08/06 15:34:13, go1.11.6) (same version as client)
# Cluster ID: deadbeef-dead-beef-dead-beefdeadbeef
#
# Enter \? for a brief introduction.
#
root@host1:26257/defaultdb> create table bla (i int);
CREATE TABLE

Time: 38.562ms

root@host1:26257/defaultdb> \| name=`cockroach sql --certs-dir=$CERTS_DIR --host=$HOST_1 --execute "SELECT concat('bla',extract('day', CURRENT_DATE)::STRING);" | tail -1` && echo "ALTER TABLE bla RENAME to $name ;"
RENAME TABLE

Time: 75.371ms

...где $CERTS_DIR и $HOST_1 — переменные среды на моем ноутбуке.

person Peter Vandivier    schedule 28.10.2019