Переименование таблицы в cockroachdb с динамическим значением - PullRequest
0 голосов
/ 15 октября 2019

В 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?

1 Ответ

0 голосов
/ 28 октября 2019

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

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

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

alter-table-syntax

Если вы создаете внешнее переименование таблицы в sql shell , вы можете передать всю команду через --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

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


Если, однако, вы действительно хотитечтобы сделать все это в сеансе встроенной оболочки ... при прочтении клиентская документация откроет утилиты \! & \|. Это позволяет вам передавать строки обратно вашему клиенту для выполнения в вашей первоначальной оболочке и опционально передавать результаты обратно в оболочку 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 - переменные средына моем ноутбуке.

...