Moje badania i eksperymenty nie przyniosły jeszcze odpowiedzi, więc liczę na pomoc.
Modyfikuję plik instalacyjny aplikacji, która w poprzednich wersjach nie miała kolumny, którą chcę teraz dodać. Nie chcę dodawać kolumny ręcznie, ale w pliku instalacyjnym i tylko wtedy, gdy nowa kolumna nie istnieje już w tabeli.
Tabela jest tworzona w następujący sposób:
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.';
Jeśli dodam następujący tekst pod instrukcją create table, nie jestem pewien, co się stanie, jeśli kolumna już istnieje (i być może jest zapełniona):
ALTER TABLE `#__comm_subscribers` ADD `subscriber_surname`;
ALTER TABLE `#__comm_subscribers` MODIFY `subscriber_surname` varchar(64) NOT NULL default '';
Więc wypróbowałem następujące, które gdzieś znalazłem. Wydaje się, że to nie działa, ale nie jestem do końca pewien, czy prawidłowo go użyłem.
/*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;*/
Czy ktoś ma dobry sposób, aby to zrobić?
Odpowiedzi:
Należy pamiętać, że
INFORMATION_SCHEMA
nie jest obsługiwane w MySQL przed wersją 5.0. Procedury składowane nie są również obsługiwane przed wersją 5.0, więc jeśli potrzebujesz obsługi MySQL 4.1, to rozwiązanie nie jest dobre.Jednym z rozwiązań stosowanych przez platformy korzystające z migracji baz danych jest zarejestrowanie w bazie danych numeru wersji schematu. Tylko tabela z jedną kolumną i jednym wierszem, z liczbą całkowitą wskazującą, która wersja jest aktualnie obowiązująca. Podczas aktualizowania schematu zwiększ liczbę.
Innym rozwiązaniem byłoby po prostu spróbować na
ALTER TABLE ADD COLUMN
komendę. Powinien zgłosić błąd, jeśli kolumna już istnieje.Złap błąd i zignoruj go w swoim skrypcie aktualizacji.
źródło
--force
przełącznik, co oznacza, że kontynuuj, nawet jeśli wystąpi błąd. wtedy po prostu zrób to. chcesz tylko mieć pewność, że nie ma stwierdzeń, których NIE chcesz odnieść, jeśli coś wcześniej zawiodło.Oto działające rozwiązanie (właśnie wypróbowane z MySQL 5.0 w systemie Solaris):
Na pierwszy rzut oka wygląda to prawdopodobnie na bardziej skomplikowane niż powinno, ale mamy tutaj do czynienia z następującymi problemami:
IF
instrukcje działają tylko w procedurach składowanych, a nie gdy są uruchamiane bezpośrednio, np. w kliencie mysqlSHOW COLUMNS
nie działa w procedurze składowanej, więc trzeba użyć INFORMATION_SCHEMATABLE_SCHEMA=DATABASE()
.DATABASE()
zwraca nazwę aktualnie wybranej bazy danych.źródło
Jeśli korzystasz z MariaDB, nie musisz używać procedur składowanych. Po prostu użyj na przykład:
Spójrz tutaj
źródło
Większość odpowiedzi dotyczy tego, jak bezpiecznie dodać kolumnę w procedurze składowanej, musiałem bezpiecznie dodać kolumnę do tabeli bez używania przechowywanej procedury i odkryłem, że MySQL nie pozwala na użycie
IF Exists()
spoza SP . Opublikuję swoje rozwiązanie, które może pomóc komuś w tej samej sytuacji.źródło
Innym sposobem na zrobienie tego byłoby zignorowanie błędu za pomocą
declare continue handler
:Myślę, że w ten sposób jest schludniej niż w przypadku
exists
podzapytania. Zwłaszcza jeśli masz wiele kolumn do dodania i chcesz kilka razy uruchomić skrypt.Więcej informacji na temat programów obsługi kontynuacji można znaleźć pod adresem http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html
źródło
Używam MySQL 5.5.19.
Lubię mieć skrypty, które można uruchamiać i ponownie uruchamiać bez błędów, zwłaszcza tam, gdzie ostrzeżenia wydają się utrzymywać się i pojawiają się ponownie później, gdy uruchamiam skrypty, które nie mają błędów / ostrzeżeń. Jeśli chodzi o dodawanie pól, napisałem sobie procedurę, aby trochę mniej pisać:
Kod służący do tworzenia procedury addFieldIfNotExists jest następujący:
Nie napisałem procedury bezpiecznej modyfikacji kolumny, ale myślę, że powyższą procedurę można łatwo zmodyfikować, aby to zrobić.
źródło
Wziąłem sproc OP i uczyniłem go wielokrotnego użytku i niezależnym od schematu. Oczywiście nadal wymaga MySQL 5.
źródło
Właśnie wypróbowałem skrypt procedury składowanej. Wygląda na to, że problemem są
'
znaki wokół ograniczników. W MySQL Dokumenty pokazują, że znaki ogranicznika nie potrzebują apostrofów.Więc chcesz:
Zamiast:
Pracuje dla mnie :)
źródło
Jeśli uruchamiasz to w skrypcie, będziesz chciał później dodać następującą linię, aby umożliwić jej ponowne uruchomienie, w przeciwnym razie otrzymasz procedurę już istnieje.
źródło
Najlepszy sposób na dodanie kolumny w PHP> PDO:
Uwaga: kolumna w tabeli nie jest powtarzalna, co oznacza, że nie musimy sprawdzać istnienia kolumny, ale aby rozwiązać problem, sprawdzamy powyższy kod:
na przykład, jeśli działa alert 1, jeśli nie 0, oznacza to, że kolumna istnieje! :)
źródło
Sprawdź, czy kolumna istnieje, czy nie w PDO (100%)
źródło
Procedura od Jake'a https://stackoverflow.com/a/6476091/6751901 jest bardzo prostym i dobrym rozwiązaniem do dodawania nowych kolumn, ale z jedną dodatkową linią:
możesz dodać nowe kolumny później i będzie działać również następnym razem:
źródło
Następnie w $ res według cyklu poszukaj klucza swojej kolumny Smth w następujący sposób:
źródło
SHOW fields FROM __TABLE__NAME__ where field='_my_col_';
a następnie sprawdzić, czy zestaw wyników nie jest pustyPoniżej znajduje się procedura przechowywana w MySQL, aby dodać kolumnę (y) w różnych tabelach w różnych bazach danych, jeśli kolumna nie istnieje w tabeli (ach) bazy danych, z następującymi zaletami
źródło
źródło