Задать вопрос
  • Как присвоить одному сайту разный IP?

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

    Eсли термин "другая локальная сеть" использован правильно, и речь идёт о физически изолированных сетях - то без объединения сетей - на самом сервере (вставить в него вторую сетевую) либо на отдельном устройстве в первой сети,- задача очевидно не решается.

    Как сделать так что бы при вводе другого IP адреса с другой подсети пользователь попадал на сайт 10.2.2.10?

    Если вопрос ставить ИМЕННО ТАК - то либо использовать destination NAT в варианте DMZ, либо socks proxy.

    Любые остальные решения подходят только в случае, когда будут чётко определены конкретные протоколы и, для TCP/UDP - порты. И когда будет чётко и однозначно определено, что скрывается под загадочным термином "попадать".
    Ответ написан
    Комментировать
  • Почему при выборке первых трех строк, MySQL просматривает все записи таблицы?

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


    Таков принцип работы у этой СУБД. MySQL сначала выбирает все соответствующие условиям отбора записи, и только потом применяет к ним ограничение количества. Правда, обычно в запросе ещё присутствует и сортировка.

    Подобный подход, кстати, ответственен за то, что при одинаковом количестве отбираемых записей чем больше начальное смещение, тем больше фактическое время выполнения запроса, и на объёмных выборках даже используются специальные методы ускорения работы.

    Мне возвращается первые 3 строки.

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

    Вот, полюбопытствуйте: FIDDLE. Кстати, забавно, что без хинта оптимизатор выбирает вовсе даже не первичный индекс... Более того, в данном конкретном случае этому есть совершенно точное и строгое объяснение - попробуйте его найти.
    Ответ написан
    Комментировать
  • Какой тип файла выбрать для проекта?

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

    Такое однозначно требует plain text.

    Во-первых, всё должно быть максимально просто. Соответственно про бинарные, а тем более проприетарные, форматы - забудь.
    Во-вторых, уж редактор, а тем более вьювер, для текстовых файлов сейчас можно найти даже в утюге. Лишь бы он после импорта и редактирования текста не стремился сохранить результат в своём хитровыделанном формате.
    В третьих, чтобы при редактировании не соблюсти простейший текстовый формат, надо быть полным [censored].

    Соответственно первый кандидат на формат - это CSV/TSV. Я за CSV с горизонтальным выравниванием при выводе (но игнорированием его при обратной загрузке), при обязательном требовании обрамления значений символом двойной кавычки. С соблюдением такого формата при редактировании справится и обезьяна.
    Второй кандидат - это текстовые форматы сериализации (JSON, XML и т.п.). Но там сложнее соблюдать формат при редактировании.
    Ответ написан
    4 комментария
  • Что и как присваивает номера vlan для подсетей?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Есть устоявшаяся практика: присваивать номер vlan номеру подсети

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

    Более того, никогда не понимал и горячее желание иметь одну подсеть на вилан. Но тут хотя бы понять можно, почему.

    понятно ограничение на количество vlan на разном оборудовании

    Если оборудование не поддерживает стандарт, который определяет 4к различных VLAN, то разумнее его не использовать - кто знает, что оно ещё делает не по стандарту...
    Ответ написан
  • Можно ли такое реализовать с помощью MySQL?

    @Akina
    Сетевой и системный админ, SQL-программист.
    В рамках реляционной СУБД для описанной схемы есть несколько принципиально разных подходов.

    Первый - одна таблица и NULL в полях, отсутствующих у конкретного типа, её описывает Сергей Соловьев, вариант 2.
    Второй - использование EAV. Удобно, динамично, но проблемы с производительностью. Хотя из всех паттернов для реляционных СУБД он походу наиболее применим для фасетного поиска.
    Третий - использование сериализованного формата хранения. Например, хранение свойств объекта в формате JSON. Но, поскольку требуется поиск по атрибутам, в этом случае необходимо будет использовать внешний поисковый движок, возможно, даже ориентированный на фасетный поиск, или будет ужас как медленно.

    Использование MongoDB на описанном материале (буквально пара типов объектов) мне кажется не очень соответствующим решением. Хотя зависит от планируемого объёма данных.
    Ответ написан
    Комментировать
  • Почему не получаются значения NEW в триггере BEFORE UPDATE?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Для всех полей, которые не указаны явно в запросе на добавление (то есть поля явно перечислены в предложении INSERT, но это не все поля таблицы, есть неупомянутые в списке поля), в шаблон вставляемой записи помещается указанное в структуре таблицы значение по умолчанию. Если таковое отсутствует, то в шаблон помещается NULL.

    Поле-автоинкремент не имеет значения по умолчанию. Генерация нового автоинкрементного значения производится после выполнения всех BEFORE триггеров. Отсюда и NULL в указанной ситуации.

    PS. https://xyproblem.info/
    Ответ написан
  • Как сделать запись в mysql с проверкой на уникальность с учётом времени из поля?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Легко решается триггером. Пример:

    - исходная таблица:
    CREATE TABLE users (
      id INT AUTO_INCREMENT PRIMARY KEY,
      username VARCHAR(100),
      created_at DATETIME DEFAULT CURRENT_TIMESTAMP
    );


    - триггер:

    CREATE TRIGGER tr_users_bi
    BEFORE INSERT ON users
    FOR EACH ROW
    BEGIN
      DECLARE allowed_created_at DATETIME;
      DECLARE error_message_text VARCHAR(64);
      SELECT MAX(created_at) + INTERVAL 12 HOUR INTO allowed_created_at
      FROM users
      WHERE username = NEW.username;
      IF NEW.created_at < allowed_created_at THEN
        SET error_message_text = CONCAT('Регистрация возможна не ранее ', allowed_created_at);
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = error_message_text; 
      END IF;
    END


    DEMO fiddle

    PS. Надеюсь, получение сгенерированного сообщения об ошибке и показ его юзеру не составит проблемы..
    Ответ написан
    Комментировать
  • Как гарантировать последовательную запись данных без пропусков id?

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


    Никак НЕ РЕАЛИЗОВЫВАТЬ.

    Оставь автоинкремент в покое - он обязан обеспечивать только уникальность, и не более. Нужна непрерывная нумерация? Создай для неё ОТДЕЛЬНОЕ поле, и нумеруй программно. Триггеры в помощь.
    Ответ написан
    4 комментария
  • Как защитить данные от повреждения при INSERT?

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

    НЕТ.

    Возможно рассогласование данных, нарушение внутренней логики системы - но никак не повреждение.

    Повреждение БД - это физическое либо логическое разрушение базы данных. Физически - например, битый сектор в теле файла таблицы. Логический (с точки зрения БД, потому как с точки зрения аппаратуры это очень даже физическое) - например, неправильное считывание номера блока данных в файле индекса вследствие наличия на диске слабого бита.

    При отсутствии аппаратных ошибок, на чистой логике повреждение БД возможно либо из-за ошибочного/злонамеренного действия, либо из-за бага/сбоя программного обеспечения. В обоих случаях - как внутри SQL-сервера, так и снаружи (ОС, третий софт, ...).
    Ответ написан
    Комментировать
  • Можно ли составить mysql запрос с выборкой не определенного множества полей?

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

    1; Ручка; Цвет; Синий; Цена; 10
    2; Нож; Материал; Цена; 200; Рукоятка; Дерево; Фото; Есть;

    Приведённый хреново форматированный текст не позволяет понять, где какое поле, и какой в нём тип данных.

    Полное ощущение, что автору требуется куча колонок (в смысле полей в структуре выходного набора). ТО есть если свойство одно, полей 4, если свойств 2, полей 6, и так далее...

    Если так, то требуемый результат называется "сводная таблица" (pivot table). Это совсем даже не реляционная структура, у которой нет и тени шанса попасть в стандарт, а потому практически ни одной СУБД штатно не поддерживается. Из популярных оно есть исключительно в SQL Server, да и там скорее исторически сложилось, чем нужно было.

    В MySQL / MariaDB ничего подходящего нет. И если кому оно реально необходимо, приходится возиться руками - хранимая процедура, динамический код... хотя на порядок разумнее оставить данные в EAV, а сводную таблицу строить на клиенте на его сервисе отчётов.

    Если же устроит выдача всех свойств, собранных в одно сериализованное поле (например, объект JSON) - то это обычная группировка и агрегация.
    Ответ написан
    Комментировать
  • Какой проект можно сделать на PL/pgSQL новичку?

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

    ИМХО

    PL/pgSQL, T-SQL и прочие аналогичные языки в первую очередь предназначены для создания систем, в которых интенсивно используется server-side логика. Ибо возможности и инструментарий такого языка кроет (установленные стандартом) возможности SQL как бык овцу...

    А всё остальное - это винтики-бантики.

    Если кто-то набросает какой-нибудь PL/pgSQL код в любом фиддле, для иллюстрации что на нем можно делать - буду премного благодарен.

    Открываешь документацию по Постгрессу, забиваешь в поиск LANGUAGE plpgsql и получаешь кучу ссылок с примерами кодов. А если это будет документация по ПостгрессПро - так ещё и по-русски.
    Ответ написан
    3 комментария
  • В чём отличие составного и покрывающего индекса?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Составной индекс - это индекс по двум и более полям. А не по одному полю. Т.е. записи индекса сортированы по полю_1, если в нём одинаковые значения, то внутри группы с одинаковым значением они сортируются по полю_2, если и там одинаковые, то по полю_3...

    Покрывающий индекс - это индекс, в выражении которого присутствуют все использованные в запросе поля. То есть при выполнении запроса серверу вообще не нужна сама таблица, достаточно индекса, всё берётся прямо из него.

    Использование кластерного индекса - это обращение к самОй таблице. Даже если сортировка этого индекса никак не способствует выполнению запроса.
    Ответ написан
    Комментировать
  • Как сказать «ничего не делаем» используя условные операторы?

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

    Реверсируйте условие и ничего не делайте в случае НЕсовпадения, т.е. в ELSE. Которое в этом случае можно вообще не писать.
    Ответ написан
    Комментировать
  • Почему paragonie/easydb не пропускает слэши?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Первым делом хорошо посчитайте количество шагов экранирования. Один - сам MySQL, второй - видимо, используемый язык, но там ещё может вмешаться фреймворк или что ещё...

    Рекомендую включить временно General Log, и посмотреть, какой именно текст запроса получает MySQL. После чего отрихтовать текст запроса.

    В крайнем случае
    WHERE `value` LIKE CONCAT('%', CHAR(92), CHAR(92), '%')
    Ответ написан
    Комментировать
  • Сетевой инженер: каковы особенности данной профессии?

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

    В основном это определяется не размером конторы, а областью её деятельности и разветвлённостью её сетевой инфраструктуры.

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

    Крупной конторе с разветвлённой сетевой инфраструктурой (как правило, речь о территориально распределённых) выделенный сетевик или даже отдел - нужны. А если проблемы в сетевой инфраструктуре способны сильно влиять на бизнес и приводить к серьёзным потерям - то такой отдел необходим.

    Крупной конторе, предоставляющей услуги связи другим конторам (т.е. тем, у которых сетевая инфраструктура - одно из главных средств производства), выделенный отдел сетевиков абсолютно и критично необходим. Причём там должны быть и сетевые администраторы, и сетевые инженеры - это весьма разные должности функционально. Список таких областей деятельности достаточно узкий - связисты, провайдеры, ну ещё датацентры, пожалуй, ну и всё.

    является ли такой режим и график работы для сетевика нормой?

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

    Для организации, у которой службы быстрого реагирования отсутствует - хоть и ненормально, но, увы, типично. И хорошо, если эта особенность соотв. образом учитывается в зарплате, но такое бывает далеко не всегда.
    Ответ написан
    Комментировать
  • Как вернуть NULL если ничего не найдено в SQL?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Можно, конечно, использовать какую-нибудь дурь типа
    WITH cte ( поля ) AS (
        -- твой запрос
        )
    SELECT [ поля ] FROM cte
    UNION ALL
    SELECT NULL, ... , NULL WHERE NOT EXISTS (
        SELECT NULL FROM cte
        )


    Но, право слово...
    Ответ написан
    Комментировать
  • Как создать процедуру, которая будет возвращать что-то?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Процедуры, в отличие от функций, не возвращают значение; поэтому в CREATE PROCEDURE отсутствует предложение RETURNS. Однако процедуры могут выдавать данные в вызывающий код через выходные параметры.

    https://postgrespro.ru/docs/postgresql/16/xproc (имеются в виду SQL-процедуры)

    Для возврата значений из PL/pgSQL процедуры используются OUT и INOUT параметры.

    https://postgrespro.ru/docs/postgresql/16/plpgsql-... (пример имеется)
    Ответ написан
    Комментировать
  • Почему один запрос работает, а другой нет?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Оператор ?| в PostgreSQL выполняет поиск строковых значений в списке элементов массива или ключей (имён атрибутов) объекта:

    jsonb ?| text[] → boolean

    Do any of the strings in the text array exist as top-level keys or array elements?

    '{"a":1, "b":2, "c":3}'::jsonb ?| array['b', 'd'] → t

    https://www.postgresql.org/docs/current/functions-...

    В PostgreSQL нет встроенных функции или оператора для указанной задачи или для проверки на пересечение двух числовых JSON массивов. Возможное решение - разобрать JSON-массив на элементы, собрать в обычный массив и использовать для двух массивов оператор &&
    Ответ написан
  • На сколько популярно и корректно хранить данные в столбце в виде JSON строки?

    @Akina
    Сетевой и системный админ, SQL-программист.
    На сколько популярно и корректно хранить данные в столбце в виде JSON строки?

    А это зависит от того, что с этими данными делать.

    Если сохранить/вернуть - да, вполне.
    Если найти по фрагменту - 50/50, и зависит в основном инструментов, имеющихся в конкретной СУБД.
    Если выполнить более сложную обработку (сумма, в т.ч. с накоплением, среднее, медиана и пр.) - скорее нет.
    Если использовать для связывания по фрагменту - почти наверняка нет.
    Ответ написан
    Комментировать
  • Как можно ускорить выполнение SQL запроса?

    @Akina
    Сетевой и системный админ, SQL-программист.
    если `prop_id` in (1,2,3,...) штук 20, может быть и больше, запрос выполняется 18 секунд, что прям совсем много.

    Критичное количество значений в таком списке - порядка 7..10, дальше действительно запрос резко замедляется.

    Workaround: создаём индексированную временную таблицу в памяти, записываем в неё набор значений, используем в запросе:

    CREATE TEMPORARY TABLE criteria (prop_id INT PRIMARY KEY) ENGINE = Memory
    SELECT prop_id FROM (VALUES ROW(1), ROW(2), ROW(3), ...) criteria (prop_id);

    и потом

    select `product_id`, count(*) as `cnt`
    from `product_prop`
    NATURAL JOIN criteria 
    group by `product_id`
    order by `cnt` desc


    Ну а ускорить ORDER BY по вычисляемому полю - вообще без шансов.
    Ответ написан
    4 комментария