mysql_real_escape_string / Говнокод #27674 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
INSERT INTO Receipt VALUES ('2', '01.06.2020', 
(SELECT ProdPrice FROM Products WHERE ProdID=2), 
(((SELECT ProdPrice FROM Products WHERE ProdID=2)*20)/100), 
(SELECT ProdPrice FROM Products WHERE ProdID=2)+(((SELECT ProdPrice FROM Products WHERE ProdID=2)*20)/100), '1');


ого

Кровь из глаз. Четыре подзапроса вместо одного, да ещё и имена колонок для вставки не указаны.
Я уже молчу про то, как считается НДС.

Запостил: cpubaker cpubaker, (Updated )

Комментарии (11) RSS

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

          Можно глянуть план ради интереса.
          Ответить
          • То есть поскольку тут подзапросы, даже в транзакцию не надо заворачивать, чтобы помочь СУБД?
            Ответить
            • Не скажу за МайИслам, но в других движках вроде бы всегда авто-транзакция на каждый стейтмент, если ты не начал транзакцию сам.

              З.Ы. Ну и в общем-то удаление одинаковых подзапросов не портит никакую изоляцию, наоборот улучшает.
              Ответить
            • Вообще тут интересный момент... Без оптимизации этот код при уровне изоляции ниже repeatable read может словить гонку с обновлением Products. И в Receipt могут попасть противоречащие друг другу числа.

              А с оптимизацией он уже всегда будет вести себя как repeatable read. И код глючить не будет.

              Т.е. при переезде с умной СУБД на более тупую можно словить весёлые глюки.
              Ответить
        • что значит старые... они по оптимизации запроса идут из одной таблици поэтому будут хешированны на чтение
          Ответить

Добавить комментарий

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8