tags:

views:

159

answers:

2

I want to keep t1,t2 and drop all other tables.

+1  A: 

You can use information_schema to find table names, and even format the results as a bunch of DROP statements.

SELECT CONCAT('DROP TABLE ', TABLE_NAME, '; ')
  FROM information_schema.tables
  WHERE table_schema = DATABASE() AND table_name NOT IN ('foo', 'bar', 'baz');

(The DATABASE() function returns the currently use'd database.)

Using PREPARE and EXECUTE, you could even avoid copy & paste, and (in MySQL 5.0.13 and later) write a stored procedure to do this.

derobert
This is what I meant. :-) Or something like this.
Workshop Alex
I'd be very careful about putting this in live code.Deleting tables is usually a dbadmin or cron/control task rather than something that should be coded. Otherwise the right to drop tables should never be given to live code that may be later vulnerable to XSS.
Sorin Mocanu
+1  A: 

You could use mysqldump to generate a list of DROP TABLE statements, filter out the ones you don't want, then pipe it back into the mysql client. Here's how we build that up

First, here's a list of DROP TABLE table statements for the database

mysqldump -uUSERNAME -pPASSWORD--add-drop-table --no-data DATABASE| \
grep ^DROP

Now we can pipe that through grep with -v to invert the match - we want statements which don't mention the tables we're retaining (another way to do this would be --ignore-table options to mysqldump)

mysqldump -uUSERNAME -pPASSWORD--add-drop-table --no-data DATABASE| \
grep ^DROP |  
grep -v 'foo\|bar'

Finally, once you're confident, you can pipe that back into mysql

mysqldump -uUSERNAME -pPASSWORD--add-drop-table --no-data DATABASE| \
grep ^DROP | \ 
grep -v 'foo\|bar' | \
mysql -uUSERNAME -pPASSWORD DATABASE
Paul Dixon