2017-05-08 3 views
0

Hallo Ich bin auf der Suche nach einer Tabelle mit Datum als Spaltenname erstellen.meine SQL verwenden eine Variable in der ALTER TABLE ADD COLUMN-Anweisung

ich diesen Code verwende Spalte der Tabelle hinzufügen:

DROP PROCEDURE IF EXISTS filldates; 
DELIMITER | 
CREATE PROCEDURE filldates(dateStart DATE, dateEnd DATE) 
BEGIN 
    WHILE dateStart <= dateEnd DO 
    ALTER TABLE dates 
    ADD dateStart VARCHAR(30); 

    SET dateStart = date_add(dateStart, INTERVAL 1 DAY); 
    END WHILE; 
END; 
| 
DELIMITER ; 
CALL filldates('2017-01-01','2017-12-31'); 

aber es ist der Fehler dateStart als Duplicate Content zeigt, weil es eine Spalte ‚dateStart‘ statt Datum erstellt. Wie kann ich dateStart als Variable verwenden?

Wenn ich "INSERT INTO tablename (_date) VALUES (dateStart);" Anstelle der ALTER TABLE-Anweisung wird kein Fehler angezeigt, und die Daten werden in die Datenbank eingefügt, aber als Zeilen in der Spalte "_date". Ich möchte, dass die Daten als Spaltenname hinzugefügt werden.

Wie dateStart als Variable

+0

Dies ist ein schlechtes Design der Tabelle sein wird. –

Antwort

1

Die kurze Antwort verwenden kann, ist, dass Sie keine Variablen wie Datenbank-, Tabellen- oder Spaltennamen in MySQL verwenden können.

Das einzige, was Sie tun können, ist die SQL-Anweisung als Zeichenfolge verketten und als prepared statement auszuführen.

SET @s=CONCAT('ALTER TABLE dates ADD COLUMN `',dateStart,'` VARCHAR(30)'); 
PREPARE stmt1 FROM @s1; 
EXECUTE stmt1; 
DEALLOCATE PREPARE stmt1; 

jedoch das Hinzufügen Feldnamen dynamisch in großen Mengen zu einer Tabelle zeigt in der Regel ein schlechtes Design (es sei denn, Ihr bereiten für Berichtszwecke Pivot-Tabellen materialisiert Daten aus, die nicht geändert werden kann).

+0

Danke Mann, das hat funktioniert – Abdulla

+0

musste nur @ s1 in Zeile 2 Ihres Codes zu @s – Abdulla

0

Dies wird Spalte Ihrer Tabelle hinzufügen, aber das ist keine gute Idee.

set @datestart = "2017-01-03"; 
set @sql = concat('Alter table tbl_1 Add Column `' ,@datestart, '`Varchar(30)'); 

PREPARE stmt from @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

Wenn Sie eine Schleife dann wollte Cursor verwenden

+0

1) keine Erklärung, warum der obige Code zu verwenden 2) der Code ist der gleiche wie ich vorgeschlagen, so fügt keine zusätzlichen Wert 3) Cursor werden für das Durchlaufen der Ergebnisse einer Auswahl verwendet. Es ist nicht notwendig, hier einen zu verwenden. – Shadow

+0

Bevor ich das tue, benutze ich, um Ihren Code zu testen, weil ich mich wundere, dass Sie @ Zeichen nicht verwenden. Und das Ergebnis meines Tests ist, mir einen Fehler zurückzugeben .. deshalb erzeuge ich einen anderen. Soll ich diesen Beitrag entfernen? –

+0

Ich habe kein @ verwendet, da Datumsstart ein Parameter für ein gespeichertes proc in der Frage ist. In diesem Fall muss kein @ verwendet werden. – Shadow