Задать вопрос
  • Какие ограничения несёт в себе INSERT IGNORE для секционированных таблиц?

    @Akina
    Сетевой и системный админ, SQL-программист.
    INSERT INTO может привести к ошибке. По любой причине. При этом процесс вставки прерывается, а все уже внесённые в таблицы изменения - откатываются.

    INSERT IGNORE преобразует ошибку в предупреждение. При этом выполнение запроса продолжается, а запись, попытка вставки которой привела к ошибке, не вставляется.

    Замечание. Дублирование - не единственное событие, которое может вызвать ошибку. Может быть ещё куча причин (CHECK constraint, SIGNAL из триггера, нарушение внешнего ключа и т.п.). Причём далеко не все типы ошибок восстановимы и могут быть проигнорированы/преобразованы в предупреждение. Если ошибка невосстановимая (как правило, это системные или внешние ошибки) - запрос прерывается по ошибке и откатывается обычным образом.

    Замечание 2. Всё вышеописанное никак не пересекается с секционированием. За исключением случая, когда значение поля не соответствует диапазону ни для одной из секций. В этом случае IGNORE срабатывает штатно - ошибка преобразуется в предупреждение, проблемная запись не вставляется.

    Нужно игнорировать дублирующиеся данные. Буду делать INSERT IGNORE

    Кроме INSERT IGNORE INTO есть ещё два типа запросов, которые обрабатывают ошибку дублирования данных - это INSERT .. ON DUPLICATE KEY UPDATE и REPLACE INTO. Изучите их - возможно, какой-то из них лучше подходит для Вашей конкретной задачи. При этом REPLACE не поддерживает модификатор IGNORE и не может игнорировать другие ошибки.
    Ответ написан
    2 комментария
  • #1045 - Доступ закрыт для пользователя 'root'@'127.0.0.1', что делать?

    @Akina
    Сетевой и системный админ, SQL-программист.
    В OpenServer -> PHPMyAdmin я создал юзера root1

    Мало создать юзера, надо ещё дать ему необходимые для работы права. Хотя бы элементарно на чтение для той БД, которая указана как база по умолчанию.

    Вот параметры юзера

    Право USAGE - это синоним права “no privileges”. Т.е. свежесозданный юзер - абсолютно бесправен.

    Читайте и применяйте GRANT Statement. Особое внимание обратить на WITH GRANT OPTION.
    Ответ написан
    Комментировать
  • Как заставить работать COUNT с GROUP BY?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Надо подсчитать количество строк в ответе запроса вида

    Вариантов несколько.

    Первый, наиболее правильный - получить это значение отдельным запросом.
    SELECT COUNT(*)  AS cnt
    FROM (
        SELECT 1
        FROM "order" AS o
             LEFT JOIN product p ON (p.order_id = o.id)
        GROUP BY o.id
        HAVING sum(p.price) >= 10
    ) x


    Второй - используя средства языка программирования или библиотеки доступа, получить количество записей в наборе записей. Обычно подобное свойство у рекордсета присутствует.

    Третий - добавить соотв. поле в каждую запись выходного набора, используя оконную функцию, и взять значение из любой записи:
    SELECT o.id, COUNT(o.id) OVER () AS cnt
    FROM "order" AS o
             LEFT JOIN product p ON (p.order_id = o.id)
    GROUP BY o.id
    HAVING sum(p.price) >= 10
    Ответ написан
  • Как объединить два запроса в один?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT order.ID, 
           order_status.Name StatusName, 
           order.Name OrderName, 
           order.Phone
    FROM order
    JOIN order_status ON order.status = order_status.id

    Если соответствие в таблицах задано иначе - исправь ON clause.
    Ответ написан
    2 комментария
  • Агрегирование в контексте группы и оконной функции?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Как отработает этот запрос?
    внутренний sum посчитает сумму в рамках групп бай, если ins_date равна cur_date, а потом внешний sum суммирует полученный результат в контексте секций?

    Именно так и будет. Считай, что оконные функции работают после HAVING и перед ORDER BY.
    Ответ написан
    Комментировать
  • Как правильно удалить все строки с минимальным значением поля?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Удалить только самые старые (оставить все остальные)
    DELETE t1
    FROM table t1
    LEFT JOIN table t2 ON t1.dup_column = t2.dup_column
                      AND t1.time_column > t2.time_column
    WHERE t2.time_column IS NULL

    Оставить только самые новые (удалить все остальные)
    DELETE t1
    FROM table t1
    JOIN table t2 ON t1.dup_column = t2.dup_column
                 AND t1.time_column < t2.time_column


    Суть задачи удалить все дубли квартир приходящие с разных импортов, по умолчанию считаем что последний файл импорта актуальный

    Создай уникальный индекс по номеру квартиры (после чистки, само собой) и используй не INSERT INTO, а REPLACE INTO.
    Ответ написан
  • Как получить всю БД в виде csv?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Задача недоопределена.

    Например, под термином CSV можно понимать как файл единой структуры (причём как plain-структуры, так и с сериализованными данными), так и несколько конкатенированных (как в процессе вывода, так и явно по окончании вывода) файлов, каждый из которых имеет свою структуру (да ещё и дополнительная информация там может храниться, вроде имён таблиц и имён/типов полей).

    Каждый из вариантов предполагает свой код для решения задачи (это если не обращать внимания на такую мелочь, что сама по себе запись в CSV в каждой СУБД делается тоже ну очень по-своему).

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

    Я не знаю их архитектуру и название таблиц заранее

    Хотя вот ещё одна точка, где могут возникнуть сложности. Теоретически все СУБД должны бы поддерживать INFORMATION_SCHEMA, всё же стандарт как бы описывает - и всё равно не всё там просто и очевидно.
    Ответ написан
    2 комментария
  • Как обозначить тип сортировки?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Передавайте индекс выражения сортировки. А по этому индексу - либо выполняйте соответствующий заранее полностью подготовленный запрос, либо стройте текст запроса на основании переданного индекса.

    Передача части запроса, которая потом будет встроена в текст запроса - плохая идея, ибо чревато инъекцией. Условное выражение на основании переданного параметра этого недостатка лишено, но похоронит возможность использования индексов для сортировки, если они могут быть применены в частной форме запроса.
    Ответ написан
    2 комментария
  • «Новый» подход к рекурсии?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Что-то уж больно на бред воспалённого сознания похоже.

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

    Но можно начать и с обычных чисел Фибоначчи.


    В случае рекурсивной реализации ряда Фибоначчи это условие n<2 и специальное значение 1. Смешно, но совершенно такие же и условие, и спецзначение у Хофштадтера.
    Ответ написан
    Комментировать
  • PostgreSQL как выбрать всех у кого день рожденья 16 февраля?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT *
    FROM table
    WHERE to_char(dob, 'MMDD') = '0216'
    Ответ написан
  • Возможно ли задать приоритет обработки конкретным таблицам?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Эти операции может, и приоритетны, но за пределами MySQL. Вот там и решайте эту проблему.

    В MySQL Community Server нет ничего подобного в принципе. А вот в Enterprise имеется MySQL Enterprise Thread Pool, умеющий приоритезировать соединения (не запросы).

    В принципе можно ещё покопаться в MySQL proxy и аналогичных. Может, и там что сыщется.
    Ответ написан
    1 комментарий
  • Как удалить в Mysql все записи кроме последнего т.е MAX(id)?

    @Akina
    Сетевой и системный админ, SQL-программист.
    DELETE t1 
    FROM test t1
    JOIN test t2 ON t2.id > t1.id;

    https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=19cb29...
    Ответ написан
    Комментировать
  • Как правильно работать со временем в таблице?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Работа с датой ускоряет или усложняет процесс, если ее заменить вбиванием цифр вручную по типу 15122021?
    Аналог 15 12 2021

    Серверу глубоко похрен. Главное - соблюдать допустимый формат. Любой из MySQL 8.0 Date and Time Literals. Просто помни, что "вбивание цифр вручную" - это прямой путь к опечаткам, а они чреваты боком...

    Как ее сделать авто добавляемой для каждого заказа и осуществлять после переборку по ним?

    И откуда ему взяться? ветром надует?
    А если есть вменяемый алгоритм формирования значения - то его следует запрограммировать. Если допустимо - то как DEFAULT в структуре таблицы, иначе в BEFORE INSERT триггере.
    Ответ написан
    2 комментария
  • Как обнулить права на папку windows 10?

    @Akina
    Сетевой и системный админ, SQL-программист.
    61b99360d259d402112061.png

    Сперва можно "Отключить наследование" и задать права прямым назначением. А потом раздать вниз.

    через изменение владельца папки, все таки смогли получить доступ

    Надеюсь изменение владельца тоже раздали вниз по дереву?

    Самый крайний случай - используем psexec.exe от Руссиновича, запускаем Explorer от локальной системы, и правим вообще всё как душа пожелает... только осторожно, не сделайте ещё хуже.
    Ответ написан
    3 комментария
  • Как обрабатывать несколько запросов одновременно через одно подключение python mysql.connector?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Проблема заключается в том, что при нескольких одновременных запросах ...

    При выполнении нескольких запросов одновременно (параллельно) каждый запрос должен выполняться в своём собственном соединении.

    MySQL в принципе не знает про параллельные запросы в одном соединении - пока выполнение запроса не завершится и не будет отдан результат, соединение просто не взаимодействует с потоком ввода.

    Если Вы умудряетесь в одном программном соединении выполнить несколько запросов, то, видимо, фреймворк самостоятельно организует несколько соединений, либо строит очередь запросов и выполняет их в одном соединении последовательно, но делает вид, что параллельно. А если всё это падает, то, возможно, он делает это кривовато. Или Вы что-то делаете кривовато - например, не очищаете соединение от последнего набора данных, а фреймворк без явной на то команды не делает этого, чтобы иметь возможность подготовиться к новой задаче, принять и выполнить следующий запрос...
    Ответ написан
    Комментировать
  • Как привести к числу строку в mysql?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Можно ли как-то конвертировать строку с числами перечислением через запятую?

    Можно. Но вот получить набор критериев для применения в WHERE IN - нельзя.

    В принципе задача в нынешнем виде (если не делать как нужно, что описано в ответе FanatPHP) имеет минимум пару решений.

    Можно изменить сепаратор на просто запятую, без пробела, и использовать FIND_IN_SET(). Но надо понимать, что при этом будет выполняться строковый неиндексированный поиск подстроки - то есть гарантированно медленно.

    Можно добавить скобки, превратив строковый список в JSON-массив, и распарсить его на отдельные элементы функцией JSON_TABLE(). Но и этот метод быстродействием не отличится.

    Так что срочно забывайте эту дурь с GROUP_CONCAT() и используйте нормальный JOIN.
    Ответ написан
  • Group by. Как отфильтровать запрос?

    @Akina
    Сетевой и системный админ, SQL-программист.
    По показанным данным и тому, что удалось выудить из описания и комментариев, мне кажется, что достаточно для каждой группы вернуть одну запись с максимальным в группе значением quantity. Это делается запросом
    WITH cte AS (
        SELECT *, ROW_NUMBER() OVER (PARTITION BY group_id ORDER BY quantity DESC) rn
        FROM tablename
    )
    SELECT *
    FROM cte
    WHERE rn = 1;


    Запрос предполагает, что для всех записей группы значение minimum одинаково. Если это не так - использовать ORDER BY quantity>minimum DESC, quantity DESC.

    Запрос предполагает, что в группе нет дубликатов по quantity. Если это не так - вернётся случайный из дубликатов с максимальным значением поля. Если нужен определённый из них - расширить соотв. образом ORDER BY.

    Если версия MySQL старая и не поддерживает ни CTE, ни оконные функции - использовать эмуляцию ROW_NUMBER() на базе UDV в подзапросе.
    Ответ написан
    Комментировать
  • Запрос для получения уникальных значений и их количества?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT categoryId, COUNT(*) AS `count`
    FROM table
    GROUP BY categoryId
    Ответ написан
    Комментировать
  • Что такое instance и как это настроить?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Что такое instance


    Вообще Instance - это экземпляр. В данном случае экземпляр MySQL-сервера.

    Скажем, в одной и той же операционной системе может работать несколько серверов MySQL - как одной и той же, так и разных версий. Только, чтобы не пересекаться по используемым ресурсам, они будут использовать разные номера портов и/или разные каналы. Вот эти серверы и есть Instances. Соответственно при подключении указываем нужный порт, и подключаемся к нужному в данный момент Instance. Обычно же в одной ОС работает только один сервер - тогда он является единственным Instance.

    PS. Операционка, в которой все они одновременно работают, тоже может быть Instance, но только уже OS instance, если она - одна из нескольких виртуализованных операционных систем, одновременно работающих на одном хосте в рамках одного VMM.

    как это настроить?

    Настройка MySQL-сервера на то, какие каналы (IP, named pipe, shared memory), а для IP - с какими настройками (номер порта), выполняется через конфигурационные файлы сервера. Где они, какие имеют имена, какие параметры следует устанавливать и прочее - читай в Reference Manual.
    Ответ написан
    Комментировать