2010-09-19 4 views
1

Использование MySQL и PHP, у меня простая таблица ранжирования с 2 столбцами user и score.Лучшая практика для поддержания ранжирования таблиц?

Раз в неделю я повторно запускаю ранжирующий скрипт и вычисляет баллы для каждого пользователя.

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

Какой самый лучший способ подойти к этому с MySQL? Делает ли update работу, если мне нужно добавить новые строки? Будет ли insert переопределить существующие строки, чтобы я мог снова вставить всю таблицу? Было бы лучше просто отбросить стол и переписать его с нуля?

**Sample Data** 

User01 2500 
User02 3000 
User03 100 

**New Data to be Added** 

User01 2700 
User02 4000 
User04 1000 // new account 

За исключением тысяч пользователей ...

+0

пожалуйста добавьте некоторые выборочные данные, что у вас есть и что вы хотите? –

ответ

1

Синтаксис REPLACE ... INTO будет вставлять новые строки при необходимости и удалить + вставка для существующих строк:

# deletes existing and inserts new row: 
REPLACE INTO users SET score = 2000, username = 'User01'; 
# deletes existing and inserts new row 
REPLACE INTO users SET score = 3000, username = 'User02'; 
# inserts new row 
REPLACE INTO users SET score = 4000, username = 'User04'; 

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

Мой любимый метод, хотя это использовать синтаксис ON DUPLICATE KEY - в основном, потому что я всегда предположил, что удаление строки, а затем ее повторная вставка, будет более «дорогим», а затем просто обновлением существующей строки. Предполагая, что username поля является UNIQUE или PRIMARY KEY индексом вы можете сделать следующее:

# Updates existing User01 row 
INSERT INTO users SET score = 2000, username = 'User01' ON DUPLICATE KEY UPDATE score = 2000; 
# Updates existing User02 row 
INSERT INTO users SET score = 3000, username = 'User02' ON DUPLICATE KEY UPDATE score = 2000; 
# Inserts new User04 row 
INSERT INTO users SET score = 4000, username = 'User04' ON DUPLICATE KEY UPDATE score = 2000; 

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

0

INSERT не будет перезаписывать существующие строки, но вместо того, чтобы дать ошибку (если, например, вы отметили столбец пользователя как уникальный и попытаться добавить уже Существующий пользователь). Точно так же UPDATE не будет вставлять новые строки, а только изменять существующие.

Удаление и переписывание всей таблицы представляется приемлемым решением, если большинство пользователей нуждается в обновлении, и есть пользователи, которые должны быть удалены, т. Е. Больше не будут содержаться в новых таблицах.

В противном случае, я бы обновить таблицу:

Портативное решение проверить, является ли ключ (т.е. пользователь) уже содержится в таблице (через SELECT) и использовать затем либо ВСТАВИТЬ несуществующие ключи или UPDATE для уже существующих ключей. Конечно, вы также можете просто попробовать INSERT и проверить код ошибки, возвращаясь к UPDATE, если вы получите ошибку нарушения ограничения.

В MySQL, вы можете также использовать следующий синтаксис, который позволяет вам операцию только с помощью одного запроса:

INSERT INTO ... ON DUPLICATE KEY UPDATE score = ... 

Однако это не является портативным и не будет работать с другими СУБД, только с MySQL.

0

Как вы упоминаете Двухсторонний

UPDATE OR INSERT

Я думаю ВСТАВИТЬ бы хорошо над обновлением. Для вставки вы добавляете один запрос. Где для обновления вам нужно запустить 2 запроса для каждого пользователя. сначала выберите пользователя, а затем обновите его на основе userId.

Так быстрей был бы вставить, и вы можете суммировать его в любое время с помощью SQL-запроса.

 Смежные вопросы

  • Нет связанных вопросов^_^