Kurz gesagt, ich habe eine SQL-Datei, die ich als Stildatei importieren möchte. skel
Dies wird also wiederholt programmgesteuert durchgeführt. Ich kann die SQL-Datei bearbeiten, wie ich möchte, aber ich möchte die Anwendung selbst lieber nicht berühren.
Diese Anwendung verwendet userid = 0
, um den anonymen Benutzer darzustellen. Es hat auch einen relevanten (leeren) Eintrag in der Datenbank, um diesen 'Benutzer' darzustellen. Daher skel.sql
sieht die Zeile in meinem ungefähr so aus:
INSERT INTO `{{TABLE_PREFIX}}users` VALUES (0, '', '', '', 0, 0, 0, '', '', 0, 0, 0, 0, 0, NULL, '', '', '', NULL);
Das Problem dabei ist, dass uid
es sich um ein auto_increment
Feld handelt, für das technisch gesehen 0
ein ungültiger Wert vorliegt. Oder zumindest, wenn Sie es auf 0 setzen, sagen Sie MySQL im Grunde: "Bitte geben Sie die nächste ID in dieses Feld ein."
Nun, ich nehme an, ich könnte INSERT
eine UPDATE
Abfrage in meine SQL-Datei einfügen, aber gibt es eine Möglichkeit, MySQL im Allgemeinen mitzuteilen, dass ich tatsächlich 0
in dieses Feld einfügen möchte ?
quelle
sql_mode
Eine durch Kommas getrennte Liste von Flags. Wenn Sie dies tunsql_mode='NO_AUTO_VALUE_ON_ZERO'
, können Sie versehentlich andere Flags deaktivierensql_mode
die Mitte der SQL-Datei überschrieb und dann auf die Variable zurückgesetztOLD_SQL_MODE
wurde, auf die am Ende des Skripts zurückgesetzt werden sollte. Dies überschrieb meineNO_AUTO_VALUE_ON_ZERO
in der Mitte meines Skripts, so dass dies nicht funktionierte. Meine Lösung bestand darin, eine neue Variable zu erstellenINIT_OLD_SQL_MODE
, auf die ich am Ende zurückgesetzt hatte, und nachdem ich auf eingestellt hattesql_mode
,NO_AUTO_VALUE_ON_ZERO
legte ich eine neue Variable fest, aufOLD_SQL_MODE
die diese temporären Überschreibungen zurückgesetzt werden konntenÜberprüfen Sie Ihren SQL-DB-Modus mit:
SELECT @@[GLOBAL|SESSION].sql_mode;
Wenn es leer oder nicht festgelegt ist, verwenden Sie:
SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO'
ACHTUNG! Wenn Sie verwenden
GLOBAL
, handelt es sich nicht um eine sofortige Änderung. Sie müssen Ihre Verbindung neu starten, um die Einstellung zu übernehmen.Wenn Sie beispielsweise Daten von einer Datenbank in eine andere wiederherstellen und nicht sicher sind, ob diese Einstellung angewendet wird, verwenden Sie sie
SESSION
für eine sofortige Änderung (sie wird beim Schließen der Verbindung zurückgesetzt). Wenn Sie fertig sind, geben Sie den Wert 0 ein, der sich auch dann nicht ändert, wenn der Wertsql_mode
geändert wird.Um diesen Modus (und andere) zurückzusetzen, verwenden Sie
SET [GLOBAL|SESSION] sql_mode=''
Null-Auto-Inkrement-Werte werden nicht empfohlen, da sie in MySQL-Datenbanken nicht als Standard festgelegt sind.
Für weitere Informationen Check mysql dev Seite Thema auf diese
Aktualisieren
Verwenden Sie für MariaDB den in diesem Kommentar angegebenen Befehl
SET sql_mode='NO_AUTO_VALUE_ON_ZERO'
quelle
SET sql_mode='NO_AUTO_VALUE_ON_ZERO'
Wenn Sie sich nicht mit MySQL-Variablen befassen möchten, ist hier ein nützlicher Hack:
INSERT INTO `{{TABLE_PREFIX}}users` VALUES (-1, '', '', '', 0, 0, 0, '', '', 0, 0, 0, 0, 0, NULL, '', '', '', NULL);
Und dann
UPDATE `{{TABLE_PREFIX}}users` SET id = 0 where id = -1;
Dies setzt natürlich voraus, dass Sie eine vorzeichenbehaftete Ganzzahl verwenden und keine negativen Werte für Ihre Tabellen-IDs verwenden.
quelle
Ausfallsicherer Weg:
SET @@session.sql_mode = CASE WHEN @@session.sql_mode NOT LIKE '%NO_AUTO_VALUE_ON_ZERO%' THEN CASE WHEN LENGTH(@@session.sql_mode)>0 THEN CONCAT_WS(',',@@session.sql_mode,'NO_AUTO_VALUE_ON_ZERO') -- added, wasn't empty ELSE 'NO_AUTO_VALUE_ON_ZERO' -- replaced, was empty END ELSE @@session.sql_mode -- unchanged, already had NO_AUTO_VALUE_ON_ZERO set END
quelle