Задать вопрос
Ответы пользователя по тегу MySQL
  • Почему не работает триггер?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    OLD менять нельзя, это содержимое строки до изменения. Менять можно только NEW, то что будет записано в строку при изменении.
    Ответ написан
    7 комментариев
  • Как изменить данные в таблице при помощи триггера?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Во-первых, в триггере AFTER нельзя изменить данные той же таблицы, на которую назначен этот триггер.
    Во-вторых, доступ к старому и новому содержимому строк в триггере осуществляется через ключи OLD. и NEW. соответственно.
    В-третьих, ваш триггер гораздо логичнее работает через BEFORE
    CREATE TRIGGER `upd_bld` BEFORE INSERT ON `MObjectBuildings`
         FOR EACH ROW
         BEGIN
             IF NEW.`Fabric` = '' THEN
                 SET NEW.`Analysis` = 'non';
             END IF;
         END;
    Ответ написан
    4 комментария
  • Как решить проблему order by и group by?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Так как price не включена в агрегатную функцию, то при группировке берётся первое попавшееся значение. Используйте MAX(price).
    Ответ написан
  • Как захватить инкремент MySQL во время создания строки?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Ответ написан
    Комментировать
  • Как составить MySQL запрос с двух таблиц?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    JOIN по общему полю
    Ответ написан
    Комментировать
  • Как написать вложенные запрос с условием и перебором?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Никак. И не нужен тут перебор, и IF не нужен. Достаточно сделать правильный первичный ключ (`User_id`, `Object_id`, `Item_id`) и вставить запись для всех пользователей
    INSERT INTO `table` (`User_id`, `Object_id`, `Item_id`, `status`)
      SELECT DISTINCT `User_id`, 101, 25, 0 FROM `table`
    Ответ написан
  • Duplicate entry '14' for key 'PRIMARY'?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Найдите максимальное значение `ext_id` и выполните команду
    ALTER TABLE `таблица` AUTO_INCREMENT = максимальное_значение+1;
    Ответ написан
    6 комментариев
  • Как быстро залить большой дамп в mysql?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Если файлы баз лежат на томе LVM и допустима кратковременная остановка сервера, то можно остановить MySQL, сделать снапшот тома, снова запустить MySQL и скопировать бинарные файлы со снапшота.
    Ответ написан
  • Ограничение внешних ключей mysql?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Данный внешний ключ означает, что нельзя удалять строки из таблицы `masters` если в таблице `clients` есть соответствующие им записи. Из таблицы `clients` строки можно удалять без ограничений.
    Ответ написан
  • Как выбрать дни рождения?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    А нюансов и будет куча. Если, например, сегодня у семи человек дни рождения, какие из них должны попасть в выборку? А если это всё не учитывать, то несложно
    (SELECT *
      FROM `birthday`
      WHERE MONTH(`date`) > MONTH(CURDATE())
        OR (MONTH(`date`) = MONTH(CURDATE()) 
          AND DAYOFMONTH(`date`) = DAYOFMONTH(CURDATE()))
      ORDER BY MONTH(`date`), DAYOFMONTH(`date`)
      LIMIT 3)
    UNION (SELECT *
      FROM `birthday`
      WHERE MONTH(`date`) = MONTH(CURDATE()) 
          AND DAYOFMONTH(`date`) = DAYOFMONTH(CURDATE()))
    UNION (SELECT *
      FROM `birthday`
      WHERE MONTH(`date`) < MONTH(CURDATE())
        OR (MONTH(`date`) = MONTH(CURDATE()) 
          AND DAYOFMONTH(`date`) < DAYOFMONTH(CURDATE()))
      ORDER BY MONTH(`date`) DESC, DAYOFMONTH(`date`) DESC
      LIMIT 3)
    Ответ написан
    8 комментариев
  • Где лучше хранить глобальный циклический буфер посещений(посетителей) сайта?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Файлы тут не годятся однозначно, ибо не поддерживают атомарную вставку/удаление строк. Вам придётся полностью блокировать файл на чтение/запись, иначе будут происходить конфликты версий и часть информации потеряется. То же самое и для blob-записи в базе данных.
    Так что оптимальный вариант - стандартная таблица БД с очисткой по крону/триггеру самой БД.
    Ответ написан
    2 комментария
  • Как правильно создать внешний ключ?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Добавить в таблицу `card_patient`:
    FOREIGN KEY (`patient`)
      REFERENCES `patient` (`id_patient`)
      ON DELETE CASCADE
      ON UPDATE CASCADE

    Только учтите, никакой автоматической связи таблиц при SELECT'е не появится, просто MySQL не даст добавить в поле `card_patient`.`patient` значение, отсутствующее в поле `patient`.`id_patient`.
    Ну и, в зависимости от настроек ON DELETE и ON UPDATE можно автоматически удалять и менять `card_patient`.`patient` при удалении/изменении `patient`.`id_patient` или блокировать такое удаление/изменение при существующей связи.
    Ответ написан
    1 комментарий
  • Как удалить запись после ее обновления?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Таблицу нельзя изменять из триггеров этой же таблицы. Можете попробовать повесить триггер AFTER INSERT на ту таблицу, куда записываются данные и удалять строки временной таблицы оттуда, но это сработает только если есть возможность по вставляемым в постоянную таблицу данным определить удаляемую из временной таблицы строку.
    Ответ написан
    Комментировать
  • Как работают агрегатные функции?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    В стандарте при использовании агрегатных функций каждое поле выборки, ORDER BY и HAVING должно быть либо результатом агрегатной функции, либо входить в GROUP BY. Таким образом приведённый вами запрос в стандарте недопустим.
    MySQL, до последней версии, допускал нестандартное использование агрегирования, выбирая для неагрегированых полей первое попавшееся значение. Начиная с версии 5.7 MySQL начал требовать соблюдения стандарта, и приведённый вами запрос выдаст ошибку. Вернуться к старым настройкам можно отключив режим ONLY_FULL_GROUP_BY в настройках или явно используя агрегатную функцию ANY_VALUE() на полях, которые раньше не агрегировались. Ваш запрос в этом случае будет выглядеть как
    SELECT ANY_VALUE(`id`), ANY_VALUE(`name`), ANY_VALUE(`age`), COUNT(*) 
      FROM `student`;

    Поскольку в запросе не указано, по каким полям проводить группировку, MySQL группирует все строки в одну. Если использовать GROUP BY <список полей>, то будут группироваться строки с одинаковыми значениями указанных в списке полей. Так запрос
    SELECT `age`, COUNT(*) 
      FROM `student`
      GROUP BY `age`;

    выдаст
    +------+----------+
    | age  | COUNT(*) |
    +------+----------+
    |  18  |    2     |
    |  17  |    1     |
    | NULL |    1     |
    +------+----------+
    Ответ написан
    Комментировать
  • Почему LOCK TABLES WRITE блокирует так же и чтение?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Потому что до окончания изменений данные могут оказаться некорректными, таблицу ведь не зря заблокировали.
    Ответ написан
    Комментировать
  • Не могу добавить строки в БД. Что делать?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Первая ошибка - выбор библиотеки mysql_, которая не рекомендована к использованию начиная с PHP 5.5 и не поддерживается, начиная с PHP 7.0.

    Вторая ошибка - прямая подстановка параметров в запрос, даже без экранирования.

    Ну и третья, главная ошибка - нежелание читать документацию. А там описана функция mysql_error(), возвращающая текст ошибки в последней операции mysql_.
    Ответ написан
    Комментировать
  • Как JSON файл с большим количеством строк передать в MySQL?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Лучше делать запрос не для каждой строки, а формировать пакетные запросы INSERT INTO (...) VALUES (...), (...), ...
    При этом надо учитывать максимальную длину запроса MySQL, заданную в переменной 'max_allowed_packet'.
    Перед работой скрипта лучше отключить все индексы по таблице, после включить их обратно.
    Ответ написан
    Комментировать
  • Как выбрать все записи из таблицы а которые весь список совпадении из таблицы b?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    SELECT `a`.*
      FROM `a`
      JOIN (
        SELECT `a_id`, COUNT(*) AS `count_ab`
          FROM `a_to_b`
          GROUP BY `a_id`
      ) AS `x` ON `x`.`a_id` = `a`.`id`
      JOIN (
        SELECT COUNT(*) AS `count_b`
          FROM `b`
      ) AS `b` ON `b`.`count_b` = `x`.`count_ab`

    Будет работать, если записи в таблице связи уникальные, то есть не встречается повторяющихся пар (`a_id`, `b_id`)
    Ответ написан
    Комментировать
  • Как найти два элемента с максимальным количеством общих связей?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    SELECT `t1`.`name`, `t2`.`name`, COUNT(*) AS `count`
      FROM `teacher` AS `t1`
      JOIN (
        SELECT DISTINCT `teacher_id`, `student_id`
          FROM `teacher_student` 
      ) AS `s1` ON `s`.`teacher_id` = `t1`.`id`
      JOIN (
        SELECT DISTINCT `teacher_id`, `student_id`
          FROM `teacher_student` 
      ) AS `s2` ON `s2`.`student_id` = `s1`.`student_id` AND `s2`.`teacher_id` > `s1`.`teacher_id`
      JOIN `teacher` AS `t2` ON `t2`.`id` = `s2`.`teacher_id`
      GROUP BY `t1`.`id`, `t2`.`id`
      ORDER BY `count`
      LIMIT 1
    Ответ написан
  • Как организовать изменение порядка строк в таблице?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Если изначально установить priority = id и только менять их местами, то очевидно, что max(priority) = max(id). А значит при добавлении следующей строки можно опять установить priority = id с помощью триггера AFTER INSERT.
    Ответ написан
    Комментировать