2011-09-20 15 views
11

Próbuję utworzyć tabelę o nazwie na podstawie bieżącego roku i miesiąca (2011-09), ale MySQL nie wydaje się to podoba.mysql (5.1)> utwórz tabelę z nazwą ze zmiennej

SET @yyyy_mm=Year(NOW())+'-'+Month(NOW()); 
CREATE TABLE `survey`.`@yyyy_mm` LIKE `survey`.`interim`; 
SHOW TABLES IN `survey`; 

+-----------+ 
| interim | 
+-----------+ 
| @yyyy_mm | 
+-----------+ 

Jeśli robię CREATE TABLE; bez kleszczy wokół @yyyy_mm, dostaję ogólny błąd składni.

@yyyy_mm postanawia na 2020.

+0

Identyfikatory nie są zmienne. Zmienne nie są identyfikatorami. Wymaga to użycia "dynamicznego SQL" - jest to niebezpieczne we wszystkich bazach danych, z którymi pracowałem. –

+0

Zobacz http://stackoverflow.com/questions/190776/how-to-have-dynamic-sql-in-mysql-stored-procedure i http://stackoverflow.com/questions/929244/mysql-create-table- with-dynamic-database-name-name i http://stackoverflow.com/questions/5530755/mysql-variables-storing-database-name –

Odpowiedz

24

Powinieneś być w stanie zrobić coś takiego:

SET @yyyy_mm=DATE_FORMAT(now(),'%Y-%m'); 
SET @c = CONCAT('CREATE TABLE `survey`.`',@yyyy_mm, '` LIKE `survey`.`interim`'); 
PREPARE stmt from @c; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
+0

nos & @nick: sweet! dzięki! – jacob

6
set @yyyy_mm=concat(year(now()),'-',month(now())); 
set @str = concat('create table survery.`', @yyyy_mm,'` like survey.interim;'); 
prepare stmt from @str; 
execute stmt; 
deallocate prepare stmt;