2013-09-25 5 views
0

Мне нужна помощь в следующем запросе в php. Я хочу создать авто номер, как 0001, 0002. Я использую этот запросphp auto generate number from my sql db

$query = "SELECT MAX(cast(registration_code as decimal)) id FROM accounts "; 
    if($result = mysql_query($query)) 
    { 
     $row = mysql_fetch_assoc($result); 

     $count = $row['id']; 
     $count = $count+1; 

     $code_no = str_pad($count, 4, "0", STR_PAD_LEFT); 
    } 

Это работает правильно, но проблемы в том, что, когда я удалить любое число, как 0001, 0002, 0003 и я удалить 0002 это создать 0004 я хочу это создаст номер пропущенной я имею в виду 0001 до 0003, если отсутствует какой-либо, что

создающих

благодаря

+1

возможно дубликат [Как найти "пробел" в противоречили с SQL?] (Http://stackoverflow.com/questions/1312101/how-to-find-a-gap-in-running-counter-with-sql) –

+0

, потому что вы уже сохранили числа до 0003, которые определяют 003 как его максимальное число. Таким образом, даже у вас осталось только 2 номера и т. Д. 001 003. Он определенно получит 003, так как он max, добавив +1 к нему, и вы получите 0004 с помощью функции MAX(). –

+1

Поскольку вы используете функцию MAX, вы всегда будете получать большее число. Если вам нужно перерабатывать удаленные номера, я думаю, вы должны сохранить список удаленных номеров, а затем выбрать меньший из этого списка. Если этот список пуст, вы используете вышеуказанный оператор sql. – user1498339

ответ

0

используется этот запрос,

SELECT (accounts1.registration_code + 1) as gap_starts_at, 
     (SELECT MIN(accounts3.registration_code) -1 FROM arrc_vouchers accounts3 WHERE accounts3.registration_code > accounts1.registration_code) as gap_ends_at 
FROM arrc_vouchers accounts1 
WHERE NOT EXISTS (SELECT accounts2.registration_code FROM arrc_vouchers accounts2 WHERE accounts2.registration_code = accounts1.registration_code + 1) 
HAVING gap_ends_at IS NOT NULL 
0

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