Meine Forschungen und Experimente haben noch keine Antwort geliefert, daher hoffe ich auf Hilfe.
Ich ändere die Installationsdatei einer Anwendung, die in früheren Versionen keine Spalte hatte, die ich jetzt hinzufügen möchte. Ich möchte die Spalte nicht manuell hinzufügen, sondern in der Installationsdatei und nur, wenn die neue Spalte noch nicht in der Tabelle vorhanden ist.
Die Tabelle wird wie folgt erstellt:
CREATE TABLE IF NOT EXISTS `#__comm_subscribers` (
`subscriber_id` int(11) NOT NULL auto_increment,
`user_id` int(11) NOT NULL default '0',
`subscriber_name` varchar(64) NOT NULL default '',
`subscriber_surname` varchar(64) NOT NULL default '',
`subscriber_email` varchar(64) NOT NULL default '',
`confirmed` tinyint(1) NOT NULL default '0',
`subscribe_date` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`subscriber_id`),
UNIQUE KEY `subscriber_email` (`subscriber_email`)
) ENGINE=MyISAM CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' COMMENT='Subscribers for Comm are stored here.';
Wenn ich unter der Anweisung create table Folgendes hinzufüge, bin ich mir nicht sicher, was passiert, wenn die Spalte bereits vorhanden ist (und möglicherweise ausgefüllt ist):
ALTER TABLE `#__comm_subscribers` ADD `subscriber_surname`;
ALTER TABLE `#__comm_subscribers` MODIFY `subscriber_surname` varchar(64) NOT NULL default '';
Also habe ich Folgendes versucht, was ich irgendwo gefunden habe. Dies scheint nicht zu funktionieren, aber ich bin nicht ganz sicher, ob ich es richtig verwendet habe.
/*delimiter '//'
CREATE PROCEDURE addcol() BEGIN
IF NOT EXISTS(
SELECT * FROM information_schema.COLUMNS
WHERE COLUMN_NAME='subscriber_surname' AND TABLE_NAME='#__comm_subscribers'
)
THEN
ALTER TABLE `#__comm_subscribers`
ADD COLUMN `subscriber_surname` varchar(64) NOT NULL default '';
END IF;
END;
//
delimiter ';'
CALL addcol();
DROP PROCEDURE addcol;*/
Hat jemand einen guten Weg, dies zu tun?
Antworten:
Beachten Sie, dass
INFORMATION_SCHEMA
MySQL vor 5.0 nicht unterstützt wird. Gespeicherte Prozeduren werden auch nicht vor 5.0 unterstützt. Wenn Sie also MySQL 4.1 unterstützen müssen, ist diese Lösung nicht gut.Eine Lösung, die von Frameworks verwendet wird, die Datenbankmigrationen verwenden, besteht darin, eine Versionsnummer für das Schema in Ihrer Datenbank aufzuzeichnen. Nur eine Tabelle mit einer einzelnen Spalte und einer einzelnen Zeile, wobei eine Ganzzahl angibt, welche Revision aktuell ist. Wenn Sie das Schema aktualisieren, erhöhen Sie die Anzahl.
Eine andere Lösung wäre, einfach den Befehl zu versuchen
ALTER TABLE ADD COLUMN
. Es sollte ein Fehler ausgegeben werden, wenn die Spalte bereits vorhanden ist.Fangen Sie den Fehler ab und ignorieren Sie ihn in Ihrem Upgrade-Skript.
quelle
--force
Schalter geben, was bedeutet, dass Sie auch dann weitermachen, wenn ein Fehler auftritt. dann mach es einfach. Sie möchten nur sichergehen, dass es keine Anweisungen gibt, die Sie NICHT erfolgreich sein möchten, wenn etwas Vorheriges fehlgeschlagen ist.Hier ist eine funktionierende Lösung (gerade mit MySQL 5.0 unter Solaris ausprobiert):
Auf den ersten Blick sieht es wahrscheinlich komplizierter aus als es sollte, aber wir müssen uns hier mit folgenden Problemen befassen:
IF
Anweisungen funktionieren nur in gespeicherten Prozeduren, nicht wenn sie direkt ausgeführt werden, z. B. im MySQL-ClientSHOW COLUMNS
funktioniert nicht in gespeicherten Prozeduren, daher muss INFORMATION_SCHEMA verwendet werdenTABLE_SCHEMA=DATABASE()
.DATABASE()
Gibt den Namen der aktuell ausgewählten Datenbank zurück.quelle
Wenn Sie sich in MariaDB befinden, müssen Sie keine gespeicherten Prozeduren verwenden. Verwenden Sie zum Beispiel:
Siehe hier
quelle
Die meisten Antworten beziehen sich auf das sichere Hinzufügen einer Spalte in einer gespeicherten Prozedur. Ich musste einer Tabelle ohne Verwendung eines gespeicherten Prozesses sicher eine Spalte hinzufügen und stellte fest, dass MySQL die Verwendung
IF Exists()
außerhalb eines SP nicht zulässt . Ich werde meine Lösung veröffentlichen, damit sie jemandem in der gleichen Situation hilft.quelle
Eine andere Möglichkeit, dies zu tun, besteht darin, den Fehler mit a zu ignorieren
declare continue handler
:Ich denke, es ist so ordentlicher als mit einer
exists
Unterabfrage. Vor allem, wenn Sie viele Spalten hinzufügen müssen und das Skript mehrmals ausführen möchten.Weitere Informationen zu Continue-Handlern finden Sie unter http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html
quelle
Ich verwende MySQL 5.5.19.
Ich mag Skripte, die Sie ohne Fehler ausführen und erneut ausführen können, insbesondere wenn Warnungen zu verweilen scheinen und später wieder angezeigt werden, während ich Skripte ausführe, die keine Fehler / Warnungen enthalten. Was das Hinzufügen von Feldern angeht, habe ich mir eine Prozedur geschrieben, um die Eingabe etwas zu vereinfachen:
Der Code zum Erstellen der Prozedur addFieldIfNotExists lautet wie folgt:
Ich habe keine Prozedur geschrieben, um eine Spalte sicher zu ändern, aber ich denke, die obige Prozedur könnte leicht geändert werden, um dies zu tun.
quelle
Ich habe den Sproc des OP genommen und ihn wiederverwendbar und schemaunabhängig gemacht. Offensichtlich benötigt es immer noch MySQL 5.
quelle
Ich habe gerade das Skript für gespeicherte Prozeduren ausprobiert. Das Problem scheinen die
'
Markierungen um die Begrenzer zu sein. Die MySQL-Dokumente zeigen, dass Trennzeichen keine einfachen Anführungszeichen benötigen.Also du möchtest:
Anstatt:
Funktioniert bei mir :)
quelle
Wenn Sie dies in einem Skript ausführen, möchten Sie anschließend die folgende Zeile hinzufügen, damit es erneut ausgeführt werden kann. Andernfalls wird ein bereits vorhandener Prozedurfehler angezeigt.
quelle
Der beste Weg, um die Spalte in PHP> PDO hinzuzufügen:
Hinweis: Die Spalte in der Tabelle ist nicht wiederholbar. Das bedeutet, dass wir nicht die Existenz einer Spalte überprüfen müssen. Um das Problem zu lösen, überprüfen wir den obigen Code:
Zum Beispiel, wenn es funktioniert, Alarm 1, wenn nicht 0, was bedeutet, dass die Spalte existiert! :) :)
quelle
Überprüfen Sie, ob eine Spalte in der gU vorhanden ist oder nicht (100%).
quelle
Das Verfahren von Jake https://stackoverflow.com/a/6476091/6751901 ist eine sehr einfache und gute Lösung zum Hinzufügen neuer Spalten, jedoch mit einer zusätzlichen Zeile:
Sie können dort später neue Spalten hinzufügen, und es wird auch beim nächsten Mal funktionieren:
quelle
Suchen Sie dann in $ res nach Zyklus nach dem Schlüssel Ihrer Spalte Smth wie folgt:
quelle
SHOW fields FROM __TABLE__NAME__ where field='_my_col_';
und dann überprüfen, ob die Ergebnismenge nicht leer istNachfolgend finden Sie die in MySQL gespeicherte Prozedur zum Hinzufügen von Spalten in verschiedenen Tabellen in verschiedenen Datenbanken, wenn die Spalte in einer oder mehreren Datenbanktabellen mit folgenden Vorteilen nicht vorhanden ist
quelle
quelle