<МЕТА> - Украина | Блоги | Українська
<META> - Украина
Интернет
Реестр
Новости
Рефераты
Товары
Блоги
искать в сообществе Mysql Perfection
Авторизация
Логин:
Пароль:
 
#

Календарь

 Декабрь 
Пн
Вт
Ср
Чт
Пт
Сб
Вс
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#

Проверка ON DUPLICATE в таблице, где нет UNIQUE KEY

Fiva | 2011-11-01 15:48:50  
Сообщение прочтено 1159 раз

Пишу сюда все реже, а багаж интересных решений растет :)

Предыстория весьма проста. Существует огромная myisam таблица. В которой есть поля, назовем их для примера id, name

По полю id - Primary, Autoincrement

в таблице много миллионов записей.

И вот, в один прекрасный момент, мы получаем задание: сделать так, чтоб при добавлении name стало уникальным.

Решение в лоб: альтер таблицы, либо переведением ее в InnoDB и использование транзакций в 2 запроса, либо добавлением UNIQUE KEY на поле name.

Решение в лоб предполагает ряд проблем:

Alter по таблице будет ехать около часа.  За это время прийдется либо останавливать сервис, либо сливать таблицу, а потом доливать инкремент.  UNIQUE KEY оказался вообще недопустимимым в данной задаче, так как ранее возможно были дубли, альтер в лоб не поедет + не было задачи удалить дубли.

Решение родилось в одном маленьком запросе:

INSERT INTO t (name) SELECT 'NAME' FROM t t1 LEFT JOIN t t2 ON t2.name='NAME' WHERE t1.id=(SELECT MIN(id) FROM t) AND t2.id IS NULL

Объяснение: Все очень просто, берем любой существующий ряд таблицы (в данном случае проще всего взять первый, с минимальным первичным ключом) и в зависимости от того есть ли такое имя - возвращаем его, или не возвращаем.


Для того, что бы добавить комментарий, Вам нужно зарегистрироваться или зайти под своим именем
Поиск:
ИнформацияОбщениеБизнесДосуг
добавить сайт | реклама на портале | контекстная реклама | контакты Copyright © 1998-2010 <META> Все права защищены