INSERT INTO Количество строк + 1

У меня есть код, который отлично работает, но вместо этого ID с автоинкрементностью я хочу вставить id = Количество строк + 1 - таблицы mediamall_favourite_media

Я хочу сделать это, потому что теперь, хотя я устанавливаю параметр auto_increment, когда я удаляю все строки. Следующая строка вставляется с последним номером. Например, я вставляю 50 строк, и я удаляю их все, а затем, если я вставляю еще одну строку (хотя таблица пуста), идентификатор равен 51...

$user =& JFactory::getUser();
 $db2 =& JFactory::getDBO();
 $mediaid = $_POST['addMediaId'];
 //$delid = $_POST['delRow'];


if(isset($_POST['submitCheck']) and $_POST['submitCheck'] == '1') { 
 $query = ' INSERT INTO '#__mediamall_favourite_media' ('id', 'userid', 'mediaid') VALUES (NULL,"'.$user->id.'","'.$mediaid.'")';
 } 
elseif(isset($_POST['submitCheck']) and $_POST['submitCheck'] == '0') { 
$query = ' DELETE FROM '#__mediamall_favourite_media' WHERE 'id' = "'.$delid.'" '; 
} 


if($query) {
 $db2->setQuery($query);
 $db2->query();
}

Пожалуйста, у вас есть решения?

1 ответ

Нет, вы не можете сделать это в транзакционной базе данных. Вот сценарий:

  • Транзакция A начинается, получает max(id) + 1 как новый идентификатор (скажем, 101).
  • Транзакция B начинается, получает max(id) + 1 как новый идентификатор (скажем, 101).
  • Выполняется транзакция А.
  • Транзакция B пытается совершить - бум! Он не может - у вас есть дубликат id 101.

(вместо max(id)+1 вы можете использовать count(*)+1 - результат будет таким же).

Попытка повторного использования отверстий не работает:

  • Транзакция A начинается, получает идентификатор как автоинкремент (скажем, 101).
  • Транзакция B начинается, получает идентификатор как автоинкремент (скажем 102).
  • Транзакция B совершает.
  • Транзакция А прерывается по какой-то странной причине (например, потерянное соединение клиента). Теперь id 101 будет не использован. Если вы попытаетесь его повторно использовать, это будет очень дорого.

Чтобы сделать эту картину еще более сложной, представьте, что это было не 2, но сказать одновременно 10 параллельных транзакций?

Другими словами, прекратите бороться с этим и соглашайтесь с ним.

licensed under cc by-sa 3.0 with attribution.