SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 20.12.2022 12:40:39

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

Как сделать типа аутоинкремент в одной строчке?

Здравствуйте.
Есть задача при каждом обращении к функции PHP возвращать из базы уникальное значение ячейки и после этого его инкрементировать.
Честно, не знаю как заблокировать таблицу до изменения этого значения, чтоб не вернуть несколько раз одно и то же значение.
Попробовал написать так:


function AutoIncrement() {
global $DB;
 
$stmt = $DB->DBH->prepare("SELECT ai_dt FROM ".$this->Table." WHERE num_dt=:num_dt FOR UPDATE");
$stmt->execute(array('num_dt' => $this->ID));
$AutoIncrement = $stmt->fetchColumn();
$stmt = $DB->DBH->prepare("UPDATE ".$this->Table." SET ai_dt=ai_dt+1 WHERE num_dt=:num_dt");
$stmt->execute(array('num_dt' => $this->ID));
 
return $AutoIncrement;
}

Но бывает иногда возвращается одно значение пару раз.
Подскажите пожалуйста как правильно это сделать?

Неактивен

 

#2 20.12.2022 12:52:33

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

Re: Как сделать типа аутоинкремент в одной строчке?

Здравствуйте.

select for update работает в транзакции. оберните в транзакцию Ваши два запроса (SELECT FOR UPDATE и UPDATE) и посмотрите на результат.


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

Неактивен

 

#3 21.12.2022 08:34:41

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

Re: Как сделать типа аутоинкремент в одной строчке?

Спасибо.
Да, наверное. Попробую.

Неактивен

 

#4 23.12.2022 07:29:55

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

Re: Как сделать типа аутоинкремент в одной строчке?

Спасибо.
Все получилось как нужно)


function AutoIncrement() {
        global $DB;

        $AutoIncrement = false;

        try {
            $DB->DBH->beginTransaction();
            $stmt = $DB->DBH->prepare("SELECT ai_dt FROM ".$this->Table." WHERE num_dt=:num_dt FOR UPDATE");
            $stmt->execute(array('num_dt' => $this->ID));
            $AutoIncrement = $stmt->fetchColumn();
            $stmt = $DB->DBH->prepare("UPDATE ".$this->Table." SET ai_dt=ai_dt+1 WHERE num_dt=:num_dt");
            $stmt->execute(array('num_dt' => $this->ID));
            $DB->DBH->commit();
         
        } catch (Exception $e) {
            $DB->DBH->rollBack();
            echo "Ошибка Sessions Transaction: " . $e->getMessage();
        }

        return $AutoIncrement;
    }
 

Неактивен

 

#5 23.12.2022 15:18:19

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

Re: Как сделать типа аутоинкремент в одной строчке?

Отлично :-)!

Еще блокировки можно делать через
https://dev.mysql.com/doc/refman/5.7/en … tions.html
, тоже удобный механизм, советую пощупать.


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

Неактивен

 

#6 24.12.2022 00:00:21

estic
Завсегдатай
Зарегистрирован: 01.10.2022
Сообщений: 25

Re: Как сделать типа аутоинкремент в одной строчке?

В документации (MySQL) встречал еще один способ реализации подобного счетчика. Что-то наподобие UPDATE tab SET i=LAST_INSERT_ID(i+1), потом той же функцией выбираете установленное значение, при необходимости "декрементировав" его (в том же SELECT или на клиенте).

Неактивен

 

#7 24.12.2022 00:05:00

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

Re: Как сделать типа аутоинкремент в одной строчке?

LAST_INSERT_ID() работает в рамках сессии и не видит значений из другой сессии, где тоже могут быть вставки в эту таблицу. так что так не стоит делать.


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

Неактивен

 

#8 24.12.2022 00:11:45

estic
Завсегдатай
Зарегистрирован: 01.10.2022
Сообщений: 25

Re: Как сделать типа аутоинкремент в одной строчке?

deadka написал:

LAST_INSERT_ID() работает в рамках сессии

В этом и фокус. Потом не из таблицы выбираете, а из "сессии".

Неактивен

 

#9 28.12.2022 09:11:56

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

Re: Как сделать типа аутоинкремент в одной строчке?

deadka написал:

Отлично :-)!

Еще блокировки можно делать через
https://dev.mysql.com/doc/refman/5.7/en … tions.html
, тоже удобный механизм, советую пощупать.

Да, тоже можно, даже не в рамках транзакции. Не знал этот способ.
Но тот способ с FOR UPDATE мне больше понравился.)

Неактивен

 

Board footer

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