SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 19.11.2011 20:23:52

KaVaLer
Участник
Зарегистрирован: 19.11.2011
Сообщений: 4

Увеличение неуникального поля на 1 при добавлении записи

Есть таблица "messages", в ней один из столбцов - id_chain. Это не индекс, он не уникален. Задача: при добавлении строки в таблицу взять максимальный id_chain, и увеличить его на один. Можно было бы реализовать это в два запроса (сначала узнаем максимальный id_chain, а потом делаем в таблице новую запись с увеличенным id_chain), но в данном случае необходимо сделать все одним запросом. Как это можно реализовать?

Неактивен

 

#2 19.11.2011 20:36:06

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Увеличение неуникального поля на 1 при добавлении записи

auto_increment Вам не подойдёт? Можно триггер написать и  повесить его на событие вставки в таблицу.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 19.11.2011 21:00:34

KaVaLer
Участник
Зарегистрирован: 19.11.2011
Сообщений: 4

Re: Увеличение неуникального поля на 1 при добавлении записи

id_chain может повторяться (когда сообщение добавляется в уже существующую цепочку), поэтому auto_increment не подходит. В данном случае сообщение должно добавляться не в существующую, а новую цепочку.

Неактивен

 

#4 19.11.2011 21:07:09

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Увеличение неуникального поля на 1 при добавлении записи

А чем, если не секрет, обуcловлена необходимость сделать это одним запросом?

Вариант сделать триггер все равно остаётся).

Как еще можно...

insert into messages(content,id_chain) values('Здесь могла быть Ваша реклама',(select max(chain_id) from messages));


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 19.11.2011 21:07:48

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Увеличение неуникального поля на 1 при добавлении записи

auto_increment не обязательно требует уникального индекса

Неактивен

 

#6 19.11.2011 21:10:14

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Увеличение неуникального поля на 1 при добавлении записи

rgbeast написал:

auto_increment не обязательно требует уникального индекса

Да, там достаточно либо простого (неуникального) индекса (или даже части составнго индекса) ну или первичный ключ на это поле.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 19.11.2011 21:46:52

KaVaLer
Участник
Зарегистрирован: 19.11.2011
Сообщений: 4

Re: Увеличение неуникального поля на 1 при добавлении записи

deadka написал:

insert into messages(content,id_chain) values('Здесь могла быть Ваша реклама',(select max(chain_id) from messages));

На подобный запрос выдает ошибку "You can't specify target table 'messages' for update in FROM clause".
Необходимость одного запроса обусловлена тем, что между двумя запросами (получение максимального id_chain и, собственно, создание новой записи) другим пользователем может быть добавлена запись в таблицу. В этом случае во втором запросе мы укажем id_chain, который уже не равен max(id_chain)+1. Учитывая то, что в messages хранится личная переписка, это не лучший вариант.

Неактивен

 

#8 19.11.2011 21:49:43

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Увеличение неуникального поля на 1 при добавлении записи

Можно использовать блокировки http://webew.ru/articles/1383.webew

Неактивен

 

#9 19.11.2011 21:50:44

KaVaLer
Участник
Зарегистрирован: 19.11.2011
Сообщений: 4

Re: Увеличение неуникального поля на 1 при добавлении записи

rgbeast написал:

auto_increment не обязательно требует уникального индекса

но в таблице может быть только один столбец с auto_increment, а он в messages уже есть - id_message

Неактивен

 

#10 19.11.2011 21:57:38

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Увеличение неуникального поля на 1 при добавлении записи

KaVaLer написал:

deadka написал:

insert into messages(content,id_chain) values('Здесь могла быть Ваша реклама',(select max(chain_id) from messages));

На подобный запрос выдает ошибку "You can't specify target table 'messages' for update in FROM clause".

Да, я ошибся, нельзя из одной таблицы выбирать и вставлять.
Но можно обернуть в транзакцию эти два запроса (если тип innodb), у Вас какой тип таблиц?
что до autoincrement, то он эмулируется простейшим триггером.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#11 20.11.2011 23:50:04

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Увеличение неуникального поля на 1 при добавлении записи

А почему не сделать вторую табличку с цепочками, и добавлять новые
цепочки в нее (и id, соответственно, использовать в таблице сообщений)?

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson