Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Есть таблица "messages", в ней один из столбцов - id_chain. Это не индекс, он не уникален. Задача: при добавлении строки в таблицу взять максимальный id_chain, и увеличить его на один. Можно было бы реализовать это в два запроса (сначала узнаем максимальный id_chain, а потом делаем в таблице новую запись с увеличенным id_chain), но в данном случае необходимо сделать все одним запросом. Как это можно реализовать?
Неактивен
auto_increment Вам не подойдёт? Можно триггер написать и повесить его на событие вставки в таблицу.
Неактивен
id_chain может повторяться (когда сообщение добавляется в уже существующую цепочку), поэтому auto_increment не подходит. В данном случае сообщение должно добавляться не в существующую, а новую цепочку.
Неактивен
А чем, если не секрет, обуcловлена необходимость сделать это одним запросом?
Вариант сделать триггер все равно остаётся).
Как еще можно...
Неактивен
auto_increment не обязательно требует уникального индекса
Неактивен
rgbeast написал:
auto_increment не обязательно требует уникального индекса
Да, там достаточно либо простого (неуникального) индекса (или даже части составнго индекса) ну или первичный ключ на это поле.
Неактивен
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 хранится личная переписка, это не лучший вариант.
Неактивен
Можно использовать блокировки http://webew.ru/articles/1383.webew
Неактивен
rgbeast написал:
auto_increment не обязательно требует уникального индекса
но в таблице может быть только один столбец с auto_increment, а он в messages уже есть - id_message
Неактивен
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, то он эмулируется простейшим триггером.
Неактивен
А почему не сделать вторую табличку с цепочками, и добавлять новые
цепочки в нее (и id, соответственно, использовать в таблице сообщений)?
Неактивен
Страниц: 1