#google-bigquery
#google-bigquery
Вопрос:
Как я могу удалить несколько таблиц в одной базе данных, которая начинается с одного и того же префикса?
Пример:
Запрос на удаление 1 таблицы
drop table project_id.db.test_table_<some_random_string>
Но как я могу удалить все таблицы, которые начинаются с одного и того же префикса test_table_
в одной и той же БД?
Ответ №1:
Возможный обходной путь был бы. (задан регион eu)
BEGIN
DECLARE drop_statments ARRAY<string>;
DECLARE len int64 default 1;
SET drop_statments = (SELECT ARRAY_AGG( 'drop table ' || table_schema ||'.' || table_name)
FROM `region-eu.INFORMATION_SCHEMA.TABLES`
WHERE table_schema = 'db' and table_name like 'Table_Prefix%'
);
WHILE ARRAY_LENGTH(drop_statments) >= len DO
EXECUTE IMMEDIATE drop_statments[offset(len-1)];
SET len = len 1;
END WHILE ;
END;
Вы можете использовать любой из приведенных ниже наборов данных INFORMATION_SCHEMA.
-- Returns metadata for tables in a single dataset.
SELECT * FROM myDataset.INFORMATION_SCHEMA.TABLES;
-- Returns metadata for tables in a region.
SELECT * FROM region-us.INFORMATION_SCHEMA.TABLES;
Комментарии:
1. Спасибо @narendra! Замена region-us на db сработала для меня как по волшебству! Приветствия!
2. Рад это слышать .. Ура!
Ответ №2:
Аналогично narendra @ solution, но с использованием FOR..IN
:
FOR drop_statement IN
(SELECT CONCAT("drop table ",table_schema,".", table_name, ";" ) AS value
FROM dataset.INFORMATION_SCHEMA.TABLES -- or region.INFORMATION_SCHEMA.TABLES
WHERE table_name LIKE "table_prefix%"
ORDER BY table_name DESC)
DO
EXECUTE IMMEDIATE(drop_statement.value); -- Here the table is dropped
END FOR;
Также стоит упомянуть, что вы можете изменить «таблица» на «просмотр» также в зависимости от информации, возвращаемой из представлений INFORMATION_SCHEMA.