Упорядоченныеобновления и удаления Ранее здесь было показано, как с помощью сочетания блоков
limit
и
order
by
можно писать запросы, формирующие ранжированную вы
борку (например, три лучших сотрудника по количеству открытых
счетов). MySQL тоже позволяет использовать блоки
limit
и
order
by
в выражениях
update
и
delete
, обеспечивая таким образом возмож
ность изменять или удалять определенные строки таблицы на основа
нии их ранга. Предположим, например, что требуется удалить строки
таблицы, используемой для отслеживания регистраций пользовате
лей в онлайновой банковской системе. Вот таблица, отслеживающая
ID клиента и дату/время регистрации:
CREATE TABLE login_history
(cust_id INTEGER UNSIGNED NOT NULL,
login_date DATETIME,
CONSTRAINT pk_login_history PRIMARY KEY (cust_id, login_date)
);
Следующее выражение заполняет таблицу
login_history
некоторыми
данными путем формирования перекрестного соединения между таб
лицами
account
и
customer
и формирования дат регистрации на основа
нии значений столбца
open_date
таблицы
account
:
mysql>
INSERT INTO login_history (cust_id, login_date) > SELECT c.cust_id, > ADDDATE(a.open_date, INTERVAL a.account_id * c.cust_id HOUR) > FROM customer c CROSS JOIN account a; Query OK, 312 rows affected (0.03 sec)
Records: 312 Duplicates: 0 Warnings: 0
Теперь таблица заполнена 312 строками относительно случайных дан
ных. Ваша задача – раз в месяц просмотреть данные таблицы
login_his
tory
, составить для руководства отчет о тех, кто использует онлайновую
банковскую систему, и затем удалить все записи кроме 50 последних.
Один из возможных подходов – написать запрос с использованием бло
ков
order
by
и
limit
для поиска 50 самых свежих регистраций:
mysql>