MySQL вставки выбрать в том же заявлении - PullRequest
3 голосов
/ 14 марта 2011

Я хочу смоделировать сценарий auto_increment во время вставки без поля со свойством auto_increment. Вот сценарий SQL-заявления:

insert into acct set id=(select @vid:=max(id)+1); select @vid;

По сути, я хочу, чтобы вставка и выбор выполнялись в то же самое время , чтобы я мог гарантировать уникальность значения vid.

Ответы [ 3 ]

1 голос
/ 14 марта 2011

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

В MyISAM оно сохраняетсяв метаданных таблицы, в InnoDB, в специальном объекте памяти, заполненном MAX(id) при первой вставке после запуска сервера.

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

0 голосов
/ 14 марта 2011

Вы можете сделать все это в транзакции , чтобы гарантировать, что никто другой не получит доступ к таблице:

START TRANSACTION;
insert into acct set id=(select @vid:=max(id)+1);
select @vid;
COMMIT;
0 голосов
/ 14 марта 2011
insert into acct values ( (select max(id)+1 from acct), ... rest_of_vars );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...