Как удалить все представления из базы данных mysql с помощью MySQL query / command?
Мне нужно удалить все представления из моей базы данных mysql. Как это сделать с помощью query?
может ли кто-нибудь помочь мне, пожалуйста?
4 ответов
цитирую Справочное Руководство MySQL:
DROP VIEW [IF EXISTS]
view_name [, view_name] ...
[RESTRICT | CASCADE]
DROP VIEW
удаляет одно или несколько представлений. Вы должны иметь DROP
привилегии для каждого представления. Если какое-либо из представлений, названных в списке аргументов, не существует, MySQL возвращает ошибку, указывающую по имени, какие несуществующие представления он не смог отбросить, но он также отбрасывает все представления в списке, которые существуют.
на IF EXISTS
предложение предотвращает возникновение ошибки для несуществующих представлений. Когда это предложение дано, a NOTE
генерируется для каждого несуществующего представления. См.раздел 12.7.5.41, "показать синтаксис предупреждений".
RESTRICT
и CASCADE
, если учесть, анализируются и учитываются.
Я использую этот:
/* DROP ALL VIEWS */
SET @views = NULL;
SELECT GROUP_CONCAT(table_schema, '.', table_name) INTO @views
FROM information_schema.views
WHERE table_schema = @database_name; -- Your DB name here
SET @views = IFNULL(CONCAT('DROP VIEW ', @views), 'SELECT "No Views"');
PREPARE stmt FROM @views;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
попробуйте этот непроверенный код
DECLARE VIEW_NAME VARCHAR(31);
DECLARE VIEW_NAMES CURSOR
FOR
SELECT table_name
FROM information_schema.views;
WHERE table_schema = 'DB_Name'
OPEN VIEW_NAMES;
REPEAT
FETCH VIEW_NAMES INTO VIEW_NAME;
DROP VIEW VIEW_NAME
UNTIL done END REPEAT;
CLOSE VIEW_NAMES;
END;
вот метод Ruby, который будет делать то, что вы хотите:
# @param [Array] databases, e.g. ['db1', 'db2']
def drop_all_views(databases)
views = ActiveRecord::Base.connection.execute("SELECT CONCAT(TABLE_SCHEMA,'.',TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_TYPE = 'VIEW' AND TABLE_SCHEMA IN('#{databases.join("', '")}');")
views = views.to_a.flatten
# Then drop all of those views from their respective databases
views.each do |v|
ActiveRecord::Base.connection.execute("DROP VIEW IF EXISTS #{v};")
end
end