MySQL error 1364 Field doesn’t have a default values

Od  wersji 5.7 serwera MySQL parametr strict mode jest domyślnie ustawiony w jego konfiguracji po instalacji serwera. W konsekwencji tego, jeśli pola nie mają ustawionej domyślnej wartości, występuje błąd zapisu danych do bazy.

Mamy dwa wyjścia: możemy zaktualizować aplikację i ustawić dla wszystkich pól w bazie danych domyślne wartości, albo zmienić konfigurację serwera.

Wybierając drugie rozwiązanie edytujemy plik /etc/mysql/my.cnf Czytaj dalej MySQL error 1364 Field doesn’t have a default values

MySQL sql_mode=only_full_group_by error

W przypadku wystąpienia w mysql błędu:

„this is incompatible with sql_mode=only_full_group_by”

należy na końcu pliku /etc/mysql/mysql.conf.d/mysqld.cnf dopisać poniższą linię:

sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

i zrestartować serwer MySQL:

root@server:/# systemctl restart mysql

MySQL instalacja pod Ubuntu 12.04

Instalacja serwera MySQL pod Ubuntu jest banalna. W pierwszej kolejności warto jest zaktualizować listę pakietów:

root@server: apt-get update

po aktualizacji wystarczy wpisać w linii poleceń poniższą komendę:

root@server: apt-get install mysql-server

Podczas instalacji zostaniemy poproszeni o podanie hasła użytkownika root. Zalecam wpisanie silnego hasła, gdyż ten użytkownik ma pełny dostęp do wszystkich baz danych, które będą ma serwerze.

Po zakończonej instalacji serwer MySQL powinien się uruchomić automatycznie. Możemy to sprawdzić wydają z konsoli polecenie: Czytaj dalej MySQL instalacja pod Ubuntu 12.04

MySQL INSERT i UPDATE na postawie SELECT

W MySQL można w prosty sposób dodać nowe wiersze do jednej tabeli na podstawie danych wybranych z innej tabeli. Poniżej przykład zapytania, które wstawia do tabela1 w pola pole1_t1, pole2_t1, … wybrane wartości z tabela2 uwzględniając zadany warunek:

INSERT INTO `tabela1` (`pole1_t1`,`pole2_t1`,`pole3_t1`,`pole4_t1`,`pole5_t1`) SELECT `pole1_t2`,`pole2_t2`,`pole3_t2`,`pole4_t2`,'dowolna_wartosc' FROM `tabela2` WHERE `pole1_t2`= '2' LIMIT 2;

Nie we wszystkie pola trzeba wstawiać wartości wybrane z innej tabeli. Jak widać w powyższym przykładzie można również zamiast ‚dowolna_wartość’ wpisać własny ciąg znaków.

Oczywiście w zapytaniu możemy wybierać dane z tej samej tabeli, do której wstawiamy nowe rekordy.

Na podobnej zasadzie możemy również aktualizować rekordy:

UPDATE tabela1 t1, (SELECT * FROM tabela2 WHERE id='x') t2 SET t1.pole1 = t2.pole1 where t1.id=t2.id;

Ciekawym rozwiązaniem może być aktualizacja pola wraz ze zwiększeniem jego wartości zależnym od parametrów pobranych na podstawie SELECT’a:

SET @a =0;
UPDATE tb1 SET pole1 = pole1 + ( @a := @a +1 ) WHERE pole2 = 1 AND pole1 > 2 ORDER BY pole1 ASC;

Powyżej wartość pole1 następujących po sobie rekordów według sortowania jest zwiększana o kolejne liczby całkowite.

Brak rozszerzenia mcrypt. Proszę sprawdzić konfigurację PHP.

Jeżeli w phpMyAdmin’ie na dole wyświetla się Wam komunikat: „Brak rozszerzenia mcrypt. Proszę sprawdzić konfigurację PHP.”, aby się go pozbyć w Ubuntu 12.04 wystarczy wydać poniższe polecenie:

root@server:# apt-get install php5-mcrypt

po zainstalowaniu biblioteki mcrypt musimy przeładować konfigurację serwera apach:

root@server:# service apache2 reload

Po ponownym zalogowaniu do phpMyAdmin’a komunikat informujący o braku mcrypt powinien zniknąć.

Jeśli nadal występuje można wykonać poniższe polecenie:

root@server:# php5enmod mcrypt

i ponownie zrestartować Apache’a:

root@server:# service apache2 restart

 

 

Ubuntu instalacja perl mysql

Żeby połączyć się z bazą danych MySQL za pomocą perl’a należy w pierwszej kolejności go zainstalować:

root@server: apt-get install perl

Jeśli przy próbie połączenia z mysql’em za pomocą perl’a otrzymujecie poniższy komunikat:

Can't locate DBI.pm in @INC (@INC contains: ...

może to oznaczać, że musicie wykonać poniższe polecenie:

root@server: apt-get install libdbi-perl

Jeśli po zainstalowaniu powyższej biblioteki, macie dalsze problemów z połączeniem z mysql’em lub otrzymujecie poniższy komunikat:

Can't locate DBD/mysql.pm in @INC ...

wystarczy wykonać polecenie:

root@server: apt-get install libdbd-mysql-perl

Jeśli łączycie się ze zdalnym serwerem pamiętajcie o:

– dodaniu odpowiednich regułek w firewall’u,

– zakomentowaniu linii: bind-address  = 127.0.0.1 w pliku /etc/mysql/my.cnf

– dodaniu uprawnień zdalnego dostępu do wybranej bazy danych dla użytkownika, którego używacie do połączenia

MySQL – zmiana hasła root’a

W celu zmiany hasła root’a do bazy danych MySQL z linii komend linux’a wydajemy poniższe polecenie:

root@server: mysqladmin -u root -p'starehasło' password nowehasło

wpisując odpowiednio zamiast „starehasło” obecne hasło root’a, a zamiast „nowehasło” hasło, które ma obowiązywać.

Jeżeli nigdy nie ustawialiście hasła dla użytkownika root do bazy danych MySQL i możecie się do niej zalogować bez podawania hasła lokalnie i zdalnie, poniższym poleceniem ustawicie hasło do serwera MySQL:

root@server: mysqladmin -u root password nowehasło

gdzie zamiast „nowehasło” wpisujecie hasło jakie ma być ustawione dla root’a.

W podobny sposób można zmienić hasło dla dowolnego użytkownika serwera MySQL:

root@server: mysqladmin -u adam -p'starehasło' password nowehasło

gdzie zamiast „adam” wpisujecie nazwę użytkownika serwera MySQL, zamiast „starehasło” – obecne hasło użytkownika adam, a zamiast „nowehasło” – hasło jakie ma być ustawione dla podanego użytkownika.

Inną metodą zmiany hasła użytkowników dostępną również z poziomu PHP, jest zalogowanie się do bazy MySQL i zmiana danych przechowywanych w tabeli z hasłami według poniższego wzoru:

root@server: mysql -u root -p

po podaniu hasła i zalogowaniu do MySQL wpisujemy:

mysql> use mysql;

dalej zmieniamy hasło dla użytkownika adam:

mysql> UPDATE `user` SET `password`=PASSWORD("nowehasło") WHERE `User`='adam';

na koniec trzeba przeładować uprawnienia:

mysql> FLUSH PRIVILEGES;
mysql> exit;

Jeśli macie problem z hasłem root’a do bazy danych, w innym artykule opisałem resetowanie hasła root’a.

MySQL – kopia tabeli, klonowanie tabel

Kopię tabeli „tabela_1” możemy utworzyć za pomocą poniższego polecenia:

mysql> CREATE TABLE tabela_2 LIKE tabela_1;

Kopiowanie danych z tabeli „tabela_1” do tabeli „tabela_2” wykonujemy poniższym poleceniem:

mysql> INSERT INTO tabela_2 SELECT * FROM tabela_1;

Tabela „tabela_1” została sklonowana.

MySQL resetowanie hasła root’a

Poniżej procedura resetowania hasła root’a do baz ydanych MySQL, któa może być stosowana na platformach Windows i Linux.

1. W pierwszej kolejności należy zatrzymać serwer MySQL:

root@server: service mysql stop

2. Uruchamiamy server mysql z poniższymi opcjami:

root@server: mysqld --skip-grant-tables --skip-networking &

W związku z tym, iż powyższe polecenie daje możliwość połączenia do serwera każdemu bez hasła, ze względów bezpieczeństwa uruchamiamy serwer bez sieci, dzięki czemu połączenie do niego jest możliwe tylko lokalnie.

3. Następnie łączymy się z serwerem:

root@server: mysql -u root

4. Z linii komend mysql wykonujemy poniższe polecenie:

mysql> FLUSH PRIVILEGES;

5. Następnie ustawiamy lub uaktualniamy hasło root’a wpisując zamiast „nowehaslo” swoje hasło do serwera MySQL:

mysql> UPDATE mysql.user SET Password=PASSWORD('nowehaslo') WHERE User='root';
Jeżeli resetujemy hasło dla root’a, który może się logować tylko lokalnie wpisujemy poniższe polecenie zamiast wcześniejszego:
mysql> UPDATE mysql.user SET Password=PASSWORD('nowehaslo') WHERE Host='localhost' AND User='root';
6. Przed uruchomieniem serwera musimy jeszcze załadować do pamięci tabelę uprawnień:
mysql> FLUSH PRIVILEGES;

7. Na zakończenie zatrzymujemy serwer i uruchamiamy do bez dodatkowych opcji poniższymi poleceniami:

root@server: /etc/init.d/mysql stop
root@server: service mysql start
Po tych zabiegach będziemy mogli zalogować się do serwera mysql za pomocą nowego hasła:
root@server: mysql -u root -p

MySQL – update 2 tabel

Czasami zachodzi w MySQL potrzeba wykonania update’u jednej tabeli na podstawie informacji przechowywanych w innej tabeli. Można to zrobić poniższym poleceniem:

UPDATE tb1 INNER JOIN tb2 ON tb1.pole1=tb2.pole2 set tb1.pole3='wartosc' WHERE tb2.pole4='warunek';

gdzie: tb1 – tabela 1, tb2 – tabela 2, pole1 – pole złączenia 1 tabeli, pole2 – pole złączenia 2 tabeli, pole3 – w pole wpisujemy nową ‚wartosc’, pole4 – pole tabeli obcej spełniające podany ‚warunek’.