Конкретный вопрос на собеседовании, на который никто не может ответить

dr-sm

Новичок
(а) реализовать поведение AUTO_INCREMENT: скрипты вставляют что-то в базу (сообщение), при этом в колонке ID должен записываться последовательно увеличающийся номер, без дыр, без наложения данных, без дублирования ID.
без for update можно и быстрее будет о_О

Код:
create table max_ids (a int(11)) engine=innodb;
insert into max_ids values(0);
create table omg (a int(11)) engine=innodb;

start transaction;
update max_ids set a = a+1;
insert into omg(a) select a from max_ids;
commit;
данный вариант кошерен?
 

algo

To the stars!
Мне вот в голову сразу приходит такое

(б) insert into tbl (x) select 'y' from dual where not exists(select * from tbl where x='y');

Ну и на (а) аналогично с подзапросом max(..)

P.S. Есть еще способ в 2 запроса, с локингом на первом селекте, но я не вижу преимуществ, способ в 1 запрос самый быстрый и правильный в данном случае.

P.P.S. Задачу делал в предположении отсутствия каких-либо индексов/ключей/ограничений.
 

algo

To the stars!
zerkms: откуда ж оно ее возьмет? попробуй..

Другое дело что это типа подзапросы, которые типа "не в тему", если я правильно понял таск.

В Oracle я типа такого юзаю в PL/SQL ;)
 

zerkms

TDD infected
Команда форума
algo
не вставляет ни NULL, ни полезные данные :)

[sql]USE `test`;

INSERT
INTO `a` (`z`)
SELECT
'y'
FROM
`a`
WHERE
NOT EXISTS (SELECT
*
FROM
`a`
WHERE
`z` = 'y');[/sql]

------ Выполнение начато: SQL1.sql ------
Выполнение завершено успешно [0.001c]
0 Строки вставлена [0.008c]
 

algo

To the stars!
dual - псевдотаблица из 1 строки, кусок из мана:
You are allowed to specify DUAL as a dummy table name in situations where no tables are referenced:

mysql> SELECT 1 + 1 FROM DUAL;
-> 2

DUAL is purely for the convenience of people who require that all SELECT statements should have FROM and possibly other clauses. MySQL may ignore the clauses. MySQL does not require FROM DUAL if no tables are referenced.
 

Sherman

Mephi
Эта тема является не просто источником нескончаемого получения лулзов, но отлично показывает, что "знание" mysql - это на самом деле, знание всяческих мелких хаков, фишичек и прочих затычек, которыми программисты mysql пытаются затыкать баги в своей СУБД, вместо того, чтобы, не изобретая велосипед, просто реализовывать стандарт.
 

zerkms

TDD infected
Команда форума
Sherman
вот как раз DUAL это не фичка mysql исключительно.
 

MiksIr

miksir@home:~$
algo - а чем два запроса отличаются от одного зпроса с подзапросом? Кроме, разве что, уменьшенного но вполне конечного интервала времени между селектом и инсертом.
 

whirlwind

TDD infected, paranoid
MiksIr там же вроде написано - не позволяет конкурентные запросы, потому что их сложно откатить.
 

MiksIr

miksir@home:~$
whirlwind, т.е. это нужно перевести как блокировка всей таблицы?
 

dr-sm

Новичок
Автор оригинала: Sherman
Эта тема является не просто источником нескончаемого получения лулзов, но отлично показывает, что "знание" mysql - это на самом деле, знание всяческих мелких хаков, фишичек и прочих затычек, которыми программисты mysql пытаются затыкать баги в своей СУБД, вместо того, чтобы, не изобретая велосипед, просто реализовывать стандарт.
:D
ты про какой стандарт-то?

PS я правильно понимаю, что в случае первой задачи select max() по полю без индекса
нагнет сервер фулл тейбл сканом?
 

whirlwind

TDD infected, paranoid
> Эта тема является не просто источником нескончаемого получения лулзов, но отлично показывает

Неправда. Это очень полезная тема. Знаешь скока народу из-за нее поусиленнее штудировала мануал (и я в том числе). Осознание того, что в мануале ответов больше чем у коллег, делает программиста более дисциплинированным, ответственным да и вообще полезным для общества :D
 

algo

To the stars!
Да, а еще я бы с удовольствием послушал отзывы грамотных людей на свой пост.
 
Сверху