Muszę usunąć wszystkie widoki z mojej bazy danych mysql. Jak mogę to zrobić za pomocą zapytania?Jak usunąć wszystkie widoki z bazy danych mysql za pomocą komendy mysql query/command?
Czy ktoś może mi pomóc?
Muszę usunąć wszystkie widoki z mojej bazy danych mysql. Jak mogę to zrobić za pomocą zapytania?Jak usunąć wszystkie widoki z bazy danych mysql za pomocą komendy mysql query/command?
Czy ktoś może mi pomóc?
Cytując MySQL Reference Manual:
DROP VIEW [IF EXISTS]
view_name [, view_name] ...
[RESTRICT | CASCADE]
DROP VIEW
usuwa jeden lub więcej widoków. Musisz mieć uprawnienie DROP
dla każdego widoku. Jeśli którykolwiek z widoków wymienionych na liście argumentów nie istnieje, MySQL zwraca błąd wskazujący po nazwie, które nieistniejące widoki nie były w stanie upuścić, ale także usuwa wszystkie istniejące widoki na liście.
Klauzula IF EXISTS
zapobiega występowaniu błędu w widokach, które nie istnieją. Gdy podano tę klauzulę, generowany jest NOTE
dla każdego nieistniejącego widoku. Zobacz Rozdział 12.7.5.41, "POKAŻ OSTRZEŻENIA Składnia".
RESTRICT
i CASCADE
, jeśli podano, są analizowane i ignorowane.
wypróbować ten kod niesprawdzone
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;
, które spowoduje spadek wszystkich widoków na serwerze, a nie w jednym db :) –
Dziękuję, iv zaktualizowałem skrypt – CloudyMarble
Oto metoda Ruby że będą robić to, co chcesz:
# @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
Używam tego:
/* 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;
Najlepsza odpowiedź tutaj, dzięki. –
Przyjemny scenariusz, thx. Z powodu GROUP_CONCAT, coś podobnego do SET GLOBAL group_concat_max_len = 1000000; może być użyteczny. –
Musiałem "ustawić @@ group_concat_max_len = 100000;", aby to działało! Jeśli masz 100 widoków, a nazwa schematu plus nazwa widoku ma więcej niż 10 znaków, możesz z łatwością przekroczyć domyślny limit 1024. – Fx32
Myślę, że jest pytając, jak upuścić wszystko w sposób zautomatyzowany. Nie można ręcznie wyszukiwać i pisać instrukcji drop dla dowolnej liczby widoków. – Cerin