TRUNCATE все таблицы, соответствующие шаблону имени

Это sql, который я использую на основе этого ответа:

SET @pattern = '%_movielist'; SELECT concat('TRUNCATE TABLE ', GROUP_CONCAT(concat(TABLE_NAME)), ';') INTO @truncatelike FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE @pattern; SELECT @truncatelike; PREPARE stmt FROM @truncatelike; EXECUTE stmt; DEALLOCATE PREPARE stmt; 

но я получаю эту ошибку Access denied for user 'root'@'%' to database 'information_schema' . Что я делаю не так? Кажется, он работает для других пользователей

Вы пытаетесь выполнить это заявление в базе данных «information_schema» . Подробнее об этой базе данных [ https://dev.mysql.com/doc/refman/5.7/en/information-schema.html%5D

Вы не должны запускать заявления в базе данных information_schema (если только вы ДЕЙСТВИТЕЛЬНО не знаете, что делаете). База данных служит в качестве «мета-репозитория», который определяет, как работает сервер. Скорее всего, вам не нужно прикасаться к нему, и вы, скорее всего, кирпич ваш сервер, если вы делаете.

На это уже ответили. [ # 1044 – Доступ запрещен для пользователя 'root' @ 'localhost' в базу данных 'information_schema'

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

Чтобы сделать эту работу для всей таблицы, соответствующей шаблону, нам потребуется использовать хранимую процедуру.

Измените имя процедуры

 CREATE PROCEDURE `new_procedure`() BEGIN -- Pattern to Match SET @pattern = '%_movielist'; -- Temporary Table to Store the Result of The Select Statement CREATE TEMPORARY TABLE IF NOT EXISTS Table_ToBeTruncated ( Id int NOT NULL AUTO_INCREMENT,TableName varchar(100), PRIMARY KEY (id) ); -- Insert all the TableName to be Truncated insert Table_ToBeTruncated(TableName) SELECT distinct concat('TRUNCATE TABLE `', TABLE_NAME, '`;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE @pattern and TABLE_SCHEMA = 'movielist'; -- Declare a variable to count the no of records to be truncated. SET @count=(Select count(*)from Table_ToBeTruncated); -- Iterate the list WHILE @count> 0 DO -- Pick One table from the Temporary Table List; SELECT TableName into @truncatelike from Table_ToBeTruncated where ID= @count; -- Prepare the statement PREPARE stmt FROM @truncatelike; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- Decrease the counter. set @count = @count- 1; END WHILE; drop TEMPORARY TABLE IF EXISTS Table_ToBeTruncated ; END