Как посчитать количество одинаковых записей в таблице.

Категории: SQL
Пометки: Дубли, копии, одинаковые,

При добавлении нового поля в таблицу, получил неожиданную ошибку MySql: Invalid default value for 'DATE'.

Оказалось, что одно из полей таблицы было задано как `DATE` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' и, скорее всего, из-за смены версии MySql, такая запись стала невалидной.

Решение:

Сначала сменить значение по умолчанию для поля на current_timestamp:

 
ALTER TABLE `reviews` 
MODIFY `DATE` datetime NOT NULL DEFAULT current_timestamp

а потом добавить нужное, например:

 
ALTER TABLE `reviews`
ADD `TEST` varchar(255) COLLATE 'utf8_unicode_ci' DEFAULT NULL;


Категории: SQL

Вовремя использования создания резервной копии БД Сайта, через mysqldump:

 
mysqldump -hlocalhost -uUSER -p DB > result.sql

Получил ошибку: 'Access denied; you need (at least one of) the PROCESS privilege(s) for this operation' when trying to dump tablespaces

Решение: добавление ключа --no-tablespaces

 
mysqldump --no-tablespaces -hlocalhost -uUSER -p DB > result.sql


Категории: SQL, -Памятка-

Столкнулся с тем, что у одного проекта поле с количеством товара было vchar. И, в один прекрасный момент, в него начали выгружать количество с двумя нулями в конце ",00". Как результат много где отвалились проверки и эти нули вылезли в карточке товара, на главной, в категории... проще сказать где они не вылезли.

Решение кажется простым, просто сменить тип с vchar на int, но MySql не даст это сделать, т.к. не сможет привести типы.

Решение:

  • Делам копию поля (на всякий пожарный)

  • Используем функцию REPLACE для удаления ",00"

  • Меняем тип, теперь это можно сделать.

 

ALTER TABLE `b_iblock_element_prop_s1` ADD `_TMP` varchar(250) COLLATE 'utf8_unicode_ci' NULL;
UPDATE b_iblock_element_prop_s1 SET _TMP = PROPERTY_21;

UPDATE b_iblock_element_prop_s1 SET PROPERTY_21 = REPLACE(PROPERTY_21, ',00', '');

ALTER TABLE `b_iblock_element_prop_s1` CHANGE `PROPERTY_21` `PROPERTY_21` int NULL AFTER `PROPERTY_20`;


Категории: SQL, -Памятка-

В MySql, начиная с версии 5, появилась возможность создавать "Представления" (view).

Представления можно назвать "виртуальными сводными таблицами", т.к. представление отображает данные из указанных таблиц и к нему можно делать запрос точно также как и к обычным таблицам.

Если говорить простоям языком, то при создании представления мы указываем из каких таблиц и какие данные брать, т.е. мы помещаем в него всю логику, а дальше вызываем его как обычную таблицу:

 
CREATE VIEW test_view_01 
AS SELECT title
    FROM blog_category
    WHERE id_parent = 0;

 
SELECT * FROM `test_view_01` 

Данные в представлении не хранятся, если они будут изменены в таблице, то обновляются и в представлении.

Отдельный момент интересный, представление можно использовать для поддержки легаси. Например, если старое приложение берет данные из какой-то таблицы (которой в новых версиях больше нет) и изменить это нельзя, то можно сделать представление с нужным названием и нужными полями.

Также замечу, что myphpadmin их вполне себе видит:

pic1


Категории: SQL

При попытке сменить пароль root пользователя mysql / mariadb (через mysql_secure_installation / mysql_secure_installation), получил ошибку "ERROR 1146 (42S02) at line 1: Table 'mysql.global_priv' doesn't exist"

 
Change the root password? [Y/n] Y
ERROR 1146 (42S02) at line 1: Table 'mysql.global_priv' doesn't exist

Решение проблемы, запустить

 
sudo mysql_upgrade


Если, после установки phpMyAdmin, видите сообщение "В конфигурационном файле необходимо задать парольную фразу (blowfish_secret)."

pic1

То стоит еще немного его настроить.


Категории: Web, SQL

При сохранении данных в БД получил ошибку Invalid datetime format: 1366 Incorrect string value, первоначально подул, что проблема с ORM библиотекой, но замена на RedBeanPHP ничего не дала, ошибка появлялась при попытке сохранить в базу HTML страницу.

Учитывая, что объемы текста были довольно большими, то понять, что именно вызывает ошибку было проблематично.

Решение оказалось довольно простым, данные, до сохранения в БД нужно было прогнать через php функцию utf8_encode.


Категории: PHP, SQL

При попытке обновить Joomla до 3.10.1 получил предупреждение, что сначала нужно поправить структур БД.

При попытке ее исправить получил ошибку: got error 168 unknown generic error from engine from storage engine


Категории: Web, SQL, CMS Joomla 3.X, Joomla
Пометки: got error 168 unknown generic error from engine from storage engine
MySql #1025 - Ошибка при переименовании (ошибка: 168 "Unknown (generic) error from engine")

Во многих языках программирования есть функция implode, позволяющая преобразовать массив в стоку с разделителем.

В SQL, и в частности в MySql , есть аналогичная возможность:

 
SELECT GROUP_CONCAT(`id`) AS id_list FROM `products` WHERE 1

Но стоит учесть, что длинна результирующей строки, в MySql, ограничена 1024 символами.
При этом, при если результат буде т длиннее, то ошибки не будет, а строка просто будет обрезана.

Поэтому, стоит сначала изменить максимальную длину:

 
SET SESSION group_concat_max_len = 1000000;


Категории: SQL
Яндекс.Метрика