Devo cancellare tutte le viste dal mio database mysql. Come posso farlo usando la query?Come cancellare tutte le viste dal database mysql usando mysql query/command?
Qualcuno può aiutarmi per favore?
Devo cancellare tutte le viste dal mio database mysql. Come posso farlo usando la query?Come cancellare tutte le viste dal database mysql usando mysql query/command?
Qualcuno può aiutarmi per favore?
Citando MySQL Reference Manual:
DROP VIEW [IF EXISTS]
view_name [, view_name] ...
[RESTRICT | CASCADE]
DROP VIEW
rimuove una o più viste. È necessario il privilegio DROP
per ciascuna vista. Se nessuna delle viste nominate nell'elenco degli argomenti non esiste, MySQL restituisce un errore che indica per nome quali viste non esistenti non è stato in grado di eliminare, ma elimina anche tutte le viste nell'elenco che esistono.
La clausola IF EXISTS
impedisce che si verifichi un errore per le viste che non esistono. Quando viene fornita questa clausola, viene generato un NOTE
per ogni vista inesistente. Vedere Sezione 12.7.5.41, "SHOW WARNINGS Sintassi".
RESTRICT
e CASCADE
, se specificato, vengono analizzati e ignorati.
provare questo codice non testato
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;
che lascerà cadere tutte le viste su un server, non in un db :) –
Grazie, iv ha aggiornato lo script – CloudyMarble
Ecco un metodo di Ruby che farà ciò che si vuole:
# @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
Sto usando questo:
/* 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;
La migliore risposta qui, grazie. –
Bella sceneggiatura, grazie. E a causa di GROUP_CONCAT, qualcosa come SET GLOBAL group_concat_max_len = 1000000; potrebbe essere utile –
Ho dovuto 'set @@ group_concat_max_len = 100000;' per farlo funzionare! Se hai 100 viste e il nome dello schema più il nome della vista è più lungo di 10 caratteri, puoi passare facilmente il limite 1024 predefinito. – Fx32
Penso che sia chiedendo come abbandonare tutto in modo automatico. Non è come cercare manualmente e scrivere una dichiarazione di rilascio per un numero arbitrario di visualizzazioni. – Cerin