Krótko mówiąc, mam plik SQL, który chcę zaimportować jako plik stylu skel
, więc będzie to wykonywane wielokrotnie, programowo. Mogę edytować plik SQL tak jak chcę, ale wolałbym nie dotykać samej aplikacji. Ta aplikacja używa userid = 0
do reprezentowania anonimowego użytkownika. Ma również odpowiednią (pustą) pozycję w bazie danych do reprezentowania tego "użytkownika". Stąd, linia w moim skel.sql
wygląda mniej więcej tak:Jak zmusić MySQL do podjęcia 0 jako poprawnej wartości auto-inkrementacji
INSERT INTO `{{TABLE_PREFIX}}users` VALUES (0, '', '', '', 0, 0, 0, '', '', 0, 0, 0, 0, 0, NULL, '', '', '', NULL);
Problem polega na tym, że uid
jest auto_increment
pole, dla którego, technicznie 0
jest niepoprawną wartość. Lub przynajmniej, jeśli ustawisz go na 0, zasadniczo mówisz MySQL, "Proszę wstawić następny id do tego pola."
Teraz przypuszczam mogłem położyć INSERT
wtedy UPDATE
zapytanie do mojego pliku SQL, ale czy istnieje sposób mówienia MySQL w ogóle, że tak, faktycznie chcę wstawić 0
w tej dziedzinie?
Jedna rzecz, na którą trzeba uważać: 'sql_mode' jest rozdzielaną przecinkami listą flag. Jeśli wykonasz 'sql_mode = 'NO_AUTO_VALUE_ON_ZERO'', możesz nieumyślnie wyłączyć inne flagi – Kip
To rozwiązanie w zasadzie działało dla mnie, jednak mój zrzut zawierał również miejsca, w których nadpisał' sql_mode' w środku pliku sql, a następnie resetowanie do zmiennej 'OLD_SQL_MODE', która została przywrócona na końcu skryptu. To nadpisało moje 'NO_AUTO_VALUE_ON_ZERO' w środku mojego skryptu, co nie działa. Moim rozwiązaniem było utworzenie nowej zmiennej 'INIT_OLD_SQL_MODE', której użyłem do zresetowania na końcu i po ustawieniu' sql_mode' na 'NO_AUTO_VALUE_ON_ZERO', ustawiłem nową zmienną' OLD_SQL_MODE', którą te tymczasowe przesłonięcia mogą zresetować do –