Задать вопрос
  • Почему очень долго выполняеться alter table в mysql 8 ubuntu?

    @Akina
    Сетевой и системный админ, SQL-программист.
    1. Вставьте в запрос явное создание индекса для работы внешнего ключа.
    2. Выполните действия тремя отдельными ALTER TABLE и выясните, какая именно операция занимает так много времени. Попробуйте явно указать для неё алгоритм выполнения.
    3. Спецификация CHAR(36) BINARY намекает, что там будет текстовое представление UUID. Да и имя поля намекает на то же самое. Но если так - то какой смысл в BINARY? чтобы потом надо было думать, что делать с регистрозависимостью? И вообще - почему бы не упаковать UUID в BINARY(16)? да, потребуется преобразование при вводе-выводе, зато ускорится обработка.
    4. ON UPDATE NO ACTION - это что, `billInc` (`uuid`) неуникальное, что ли? А сколько вообще записей в `billInc`?
    Ответ написан
    Комментировать
  • Как узнать позицию записи в базе?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT COUNT(*) AS row_position
    FROM table_name t1
    JOIN table_name t2 ON t1.ordering_column >= t2.ordering_column
    WHERE t2.identifying_column = 'Объявление 7'
    Ответ написан
    Комментировать
  • Как создать порядковый номер для заказа конкретного заведения?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Пример реализации.
    -- рабочая таблица
    CREATE TABLE orders (
      id INT AUTO_INCREMENT PRIMARY KEY,
      project_id INT,
      project_number INT
      );

    -- опорная таблица для генерации номеров в разрезе проектов
    CREATE TABLE generate_project_number (
      project_id INT,
      project_number INT AUTO_INCREMENT,
      PRIMARY KEY (project_id, project_number)
      ) ENGINE = MyISAM;

    -- триггер-генератор
    CREATE TRIGGER generate_project_number
    BEFORE INSERT ON orders
    FOR EACH ROW
    BEGIN
      -- вставить хапись в опорную таблицу для генерации номера
      INSERT INTO generate_project_number (project_id) VALUES (NEW.project_id);
      -- вставить сгенерированный номер в рабочую таблицу
      SET NEW.project_number = LAST_INSERT_ID();
      -- почистить опорную таблицу от лишних записей
      DELETE FROM generate_project_number 
      WHERE project_id = NEW.project_id
        AND project_number < NEW.project_number;
    END

    DEMO fiddle
    Ответ написан
    Комментировать
  • В чем состоит разница между "WHERE" и "AND" в LEFT JOIN?

    @Akina
    Сетевой и системный админ, SQL-программист.
    В чем состоит разница между "WHERE" и "AND" в LEFT JOIN?

    Тем, что AND operator может использоваться в том месте запроса, где он оказывает влияние на связывание с использованием LEFT JOIN (в составе выражения в ON clause), тогда как WHERE keyword в принципе не может использоваться в таком месте.
    Ответ написан
    Комментировать
  • "Incorrect syntax near '18'. Unclosed quotation mark after the character string ')'." что с этим делать?

    @Akina
    Сетевой и системный админ, SQL-программист.
    $" Values(N'{NAZVD.Text}', N'{SLOZHD}', '{dateTimePicker2.Value.ToString("yyyy/MM/dd")}, N'{comboBox1.SelectedValue}', N'{VIDD.Text}')";
               ^---- 1 -----^   ^--- 2 --^  ^----------------------- 3 -----------------------^                         ^-4-^           ^----- ???
    Ответ написан
    1 комментарий
  • Как работать с двумя и более базами данных одновременно?

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

    PDO подключается не к базе данных, а к серверу. Просто в процессе подключения некоторая база сервера назначается текущей, и в случаях, когда в имени таблицы отсутствует алиас базы данных, считается, что данная таблица лежит в текущей БД. Кстати, в процессе работы текущая БД может быть и изменена - запросом USE new_default_database_name

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

    А если ещё подключить внешние таблицы (используя FEDERATED ENGINE) - то можно работать и с данными из баз на другом инстансе (сервере) MySQL.
    Ответ написан
    Комментировать
  • Какой выбрать маршрутизатор для сети из 500 пк и 12 VLAN?

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

    Пардон, в каком месте тупит? С микротика в кабинеты и обратно, или между кабинетами?
    Если первое - то none7 скорее всего прав. Всё же у этого Длинка производительность матрицы 128 Гбит, так что десятку она должна пропускать со свистом, используя всего около 15% своей производительности.
    Если второе - то при большом трафике межкабинет может запросто сожрать эти 128Г и не подавиться.
    А ещё я не исключаю, что причина в том, что один кабинет просто делит на всех 1 Гбит. Если его раскидать на сотню клиентов - каждому достанутся слёзы.

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

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

    Нет.

    Адрес сети - это вообще IPадрес или это просто номер?

    Это IP-адрес.

    Под что уходят адреса 192.168.1.0 и 192.168.1.255 и 192.168.1.256 при маске 255.255.255.0

    192.168.1.0 - адрес подсети;
    192.168.1.255 - адрес бродкаста подсети;
    192.168.1.256 - не существует.
    Ответ написан
    Комментировать
  • Как вычитать таблицу после JOIN?

    @Akina
    Сетевой и системный админ, SQL-программист.
    NOT IN в большинстве случаев - самая медленная реализация. Лучше использовать, в зависимости от объёма данных и наличия индексов, либо WHERE NOT EXISTS, либо LEFT JOIN WHERE IS NULL.

    SELECT * 
    FROM `table1` 
    JOIN `table2` ON `title`=`sometitle` 
    WHERE NOT EXISTS ( SELECT NULL
                       FROM table3
                       WHERE table1.id = table3.id )
    ORDER BY `date`


    SELECT * 
    FROM `table1` 
    JOIN `table2` ON `title`=`sometitle` 
    LEFT JOIN table3 ON table1.id = table3.id
    WHERE table3.id IS NULL
    ORDER BY `date`


    Что именно использовать - надо смотреть по построенному плану запроса и практическому сравнению производительности запросов.
    Ответ написан
    Комментировать
  • Является ли приемлимой практикой использование JSON обьектов в столбцах таблицы базы данных PostgreSQL?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Если говорить об общем подходе - JSON в БД должен использоваться только и исключительно в случае, когда вся работа с JSON ограничивается простейшим "записать в БД" - "извлечь из БД". При этом модификация в момент записи/извлечения можно не учитывать.

    Если же JSON используется более нагруженно (поиск, сравнение, частичная модификация и пр.), то в большинстве случаев от его использования следует отказываться в пользу нормализованных plain-структур. При правильном индексировании они выиграют у JSON по потреблению ресурсов сервера. Хотя, конечно, в каждом отдельном случае нужно смотреть конкретные условия - тип использования, возможности оптимизации этого процесса в конкретной (версии) СУБД и пр. Да и то, JSON тут реально может конкурировать разве что с EAV.
    Ответ написан
    2 комментария
  • Как отсортировать по столбцу данные, при этом чтобы имя столбца было взято из другого столбца?

    @Akina
    Сетевой и системный админ, SQL-программист.
    В коде SQL запрос выглядит так:
    SELECT ANY_VALUE(title) AS title_list,
           SUM(count_model) AS count_model,
           COUNT(*) AS total,
           ANY_VALUE(created_at) AS `date`
    FROM mymodels
    GROUP BY name_list
    ORDER BY name_list;

    https://dbfiddle.uk/tiX1HDll

    Возможно вместо ANY_VALUE использовать MIN/MAX, это не изменит результата, хотя и противоречит логике.
    Ответ написан
    3 комментария
  • Связи в Mysql, как исправить ошибку 1215?

    @Akina
    Сетевой и системный админ, SQL-программист.
    К самим скриптам есть только одна претензия - в таблице photos отсутствует индекс по product_id, который необходим для создания внешнего ключа. После исправления этого косяка запрос на создание FOREIGN KEY выполняется без проблем.

    FIDDLE

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

    =========================

    Но это с формальной стороны. А вот логика - она лежит в глубоком ауте. И не понимает, почему идентификатор фотографии должен быть равен идентификатору продукта.
    Ответ написан
    Комментировать
  • Как сделать сортировку по 2 датам?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Если показанные исходные точны, то
    ORDER BY COALESCE(NULLIF(date2, ''), date1)
    Ответ написан
  • Могут ли быть два типа связи одновременно между двумя таблицами?

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

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

    Абстрагировавшись от всей теории разработки БД, выбираю самое простое решение ..

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

    Чем скорее Вы смиритесь с тем, что следует начать работу заново, тем больше у Вас будет времени на её выполнение...
    Ответ написан
    Комментировать
  • Как максимально надёжно скрыть свой IP адрес?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Самое надёжное - действительно работать из разрешённого местоположения. Например, с оставленного дома ноута. А издалека подключаться и рулить процессом по RDP или с использованием аналогичной технологии.
    Ответ написан
  • Как запретить домашнему ПК взаимодействовать с локальной сетью?

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

    Если комп подключен через коммутаторы - согласен с предыдущим оратором. Довести до роутера в отдельном VLAN. А дальше опять изоляция порта.
    Ответ написан
    3 комментария
  • Как в таблицу sql с 4 столбцами вставить список значений, в котором может быть меньше 4х значений?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Пример реализации, когда показанный список передаётся в запрос как один (многострочный) строковый литерал @list:

    INSERT INTO test (a,b,c,d)
    SELECT a,b,c,d
    FROM JSON_TABLE(
      CONCAT('[', REPLACE(REPLACE(@list, '(', '['), ')', ']'), ']'),
      '$[*]' COLUMNS (
        a INT PATH '$[0]',
        b INT PATH '$[1]',
        c INT PATH '$[2]',
        d INT PATH '$[3]'
        )                   
      ) jsontable

    DEMO fiddle

    Если данные на вставку лежат в файле - есть функция LOAD_FILE (не забыть GRANT FILE).
    Если данные передаются из языка/фреймворка - разумнее прямо там создать JSON и не париться с CONCAT и REPLACE.
    Если NULL не устраивает - добавить COALESCE.
    Ответ написан
    Комментировать
  • Как правильно совместить DELETE и LEFT JOIN?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Синтаксис Firebird в принципе не предусматривает многотабличного удаления. Никаких JOIN - это не MySQL. Нужно фильтровать записи - добро пожаловать в мир коррелированных подзапросов и [NOT] EXISTS.

    Руководство по языку SQL для Firebird 2.5, страница 246.
    Ответ написан
    Комментировать
  • Как сгруппировать ответ?

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH
    cte1 AS (
      SELECT jsonb_build_object('name',   users.name, 
                               'value',  comments.value,
                               'rating', comments.rating) single_user,
             comments.order_id,
             'comment' || ROW_NUMBER() OVER (PARTITION BY comments.order_id ORDER BY comments.id) num
      FROM users
      JOIN comments ON users.id = comments.user_id
    ),
    cte2 AS (
      SELECT jsonb_build_object('order_id', order_id) ||
             jsonb_object_agg(num, single_user) single_order
      FROM cte1
      GROUP BY order_id
    )
    SELECT jsonb_agg(single_order) final_data
    FROM cte2;

    DEMO fiddle
    Ответ написан
    Комментировать
  • Как задать условие для цикла?

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

    Например, строка {0, 0, 1, 5, 0, 7, 0, 0} превратится в {-1, -1, 1, 5, 0, 7, -1, -1}.

    Всё. Теперь все оставшиеся в массиве нули - это окна.
    Ответ написан
    2 комментария