Как удалить все представления из базы данных 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