2017-02-10 3 views
1

Ich habe ein kleines Problem, den Tabellennamen dynamisch zu erstellen.MYSQL gespeicherte Prozedur dynamische Tabelle aus dem Datum erstellen

Zum Beispiel Diese Abfrage (SELECT DATE_FORMAT(NOW(),'%Y%m'))201702

Mein Motiv gibt, ob die Tabelle vorhanden zu überprüfen ist. Wenn es nicht existiert, wird es automatisch erstellt. Jetzt ist hier mein Problem.

messages_`,datereturn

Es scheint, ich bin Fehler immer noch kompilieren. Wie übergeben wir Parameter zum Erstellen der Tabelle?

Wirklich zu schätzen Ihre Hilfe.

Voll Code:

BEGIN 
    SET datereturn = (SELECT DATE_FORMAT(NOW(),'%Y%m')); 

    CREATE TABLE IF NOT EXISTS `messages_`,datereturn (
     `mid` bigint(17) NOT NULL, 
     `uid` int(11) NOT NULL, 
     `csid` int(11) NOT NULL, 
     `content` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, 
     `content_type` tinyint(4) NOT NULL, 
     `datecreated` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
     `datecreated1` bigint(13) DEFAULT NULL, 
     PRIMARY KEY (`mid`) 
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
    END 

EDIT: es ist anders als die Antwort vorgeschlagen. Ich mache die Tabelle dynamisch mit MySQL 5.6. Der oben vorgeschlagene Thread funktioniert nicht für meine Version. Also, ich weiß nicht, warum es möglich ist, zu duplizieren.

+0

Meinen Sie 'CONCAT ("messages_", datereturn)'? –

+0

@ PM77-1, Nun, ich habe versucht, dass ich diesen Fehler bekomme '' 'Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Server-Version entspricht, für die richtige Syntax in der Nähe von 'Datumzurück' ('mid' bigint (17) NOT NULL,' uid' int (11) NOT NULL, 'csid 'in Zeile 4''') – FreedomPride

+0

Mögliches Duplikat von [mysql (5.1)> Tabelle mit Namen aus einer Variablen erstellen] (http://stackoverflow.com/questions/7489142/mysql-5-1-create-table-with-name-from-a-variable) –

Antwort

1

Gespeicherte Prozeduren ermöglichen keine Kombination von Variablen in SQL-Bezeichnern. Mit anderen Worten, Dinge wie Tabellennamen müssen festgelegt werden, bevor die Abfrage analysiert wird.

So benötigen Sie einen dynamic SQL statement erstellen und die gespeicherte Prozedur die Anweisung zur Laufzeit CREATE TABLE machen vorbereiten:

BEGIN 
    SET @sql = CONCAT('CREATE TABLE IF NOT EXISTS messages_',datereturn,' (', 
     'mid bigint NOT NULL, ', 
     'uid int NOT NULL, ', 
     'csid int NOT NULL, ', 
     'content varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, ', 
     'content_type tinyint NOT NULL, ', 
     'datecreated timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, ', 
     'datecreated1 bigint DEFAULT NULL, ', 
     'PRIMARY KEY (mid)', 
    ') ENGINE=InnoDB DEFAULT CHARSET=latin1'); 

    PREPARE stmt FROM @sql; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt;  
END 

(Anmerkung: Ich habe diesen Code nicht getestet haben, also wenn ich ein Angebot verpasst, erwarte ich, Sie wissen, wie Sie das beheben können.)

In diesem Beispiel habe ich auch Ihre Back-Ticks entfernt, weil sie nicht notwendig sind, und ich habe die Längenoptionen für int-Typen entfernt, weil sie keinen Effekt haben.

Alles, was gesagt wird, muss ich fragen, warum Sie eine Tabelle pro Tag benötigen. Scheint wie ein Code-Geruch für mich. Hast du stattdessen creating a table partitioned by date in Betracht gezogen?

+0

Bill, du bist ein Leben Retter. Ich muss diesen Parameter an den Server zurückgeben. Also wird die Einfügemethode auf das Datum basieren. Nun, es ist das erste Mal, ich höre Zugestelltabelle nach Datum partitioniert. Ich schaue hinein. – FreedomPride

0
SET @CrtTbl = CONCAT('CREATE TABLE', CONCAT('`messages_', datererun), '(mid bigint(17) NOT NULL, .... and so on 

... 

PREPARE CrtTblStmt FROM @CrtTbl; 
EXECUTE CrtTblStmt; 
DEALLOCATE PREPARE CrtTblStmt; 

etwas wie die

Verwandte Themen