2010-02-04 3 views
1

В моей вымышленной базе данных у меня есть несколько столбцов данных. При разработке интерфейса PHP для скрипта необходимо было разрешить пользователю изменять все атрибуты кортежа, если это необходимо.SQL-предложение для оптимизации запросов UPDATE?

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

UPDATE foo 
    SET name='bar' location='YYZ' drink='ale' 
where user='smithj'` 

обновит все три атрибута кортежа «ИвановИван», даже если два из атрибутов одинаковы.

Есть ли способ, чтобы SQL (MySQL, если это имеет значение) автоматически отфильтровывает избыточные обновления, похожие на пункт IF EXISTS в CREATE TABLE IF EXISTS?

Спасибо!

ответ

1

«Если вы установите столбец для значения, которое оно имеет в настоящее время, MySQL замечает это и не обновляет его."

http://dev.mysql.com/doc/refman/5.0/en/update.html

+0

RTFM, действительно ... спасибо! –

0

Вам необходимо сделать это в своем коде. В любом случае запрос «пример» вы предоставляете крики для SQL injection :)

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

+0

Наиболее определенно! Для демонстрационных целей, пример кода был хорошо, но да, определенная опасность безопасности там. –

1

Лично вы, скорее всего, пытаетесь сделать предварительную зрелую оптимизацию на этом этапе. Обновление трех значений, чтобы сделать их такими, какие они должны быть, будет очень хорошо.

Проверка того, что нужно обновить, скорее всего, будет стоить дороже.

1

Первый вопрос, на который нужно ответить, - почему?

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

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

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

0

Идя с тем, что Солнечный предложил, вы должны параметризовать запрос ,

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

Однако, это печально, если у вас нет большого количества строк, это не должно сильно повлиять на вашу производительность.