0

我有一个可以正常工作的代码,但是我想插入带有自动增量的 ID = 行数 + 1 - mediamall_favourite_media 表

我想这样做是因为现在我在删除所有行时设置了 auto_increment 选项。下一行插入最后一个数字。例如 - 我插入 50 行并将它们全部删除,然后如果我再插入一行(尽管表为空),则 id 为 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();
}

拜托,你有什么解决办法吗?

4

1 回答 1

1

不,您不能在事务数据库中这样做。这是场景:

  • 事务 A 开始,获取max(id) + 1新的 id(比如 101)。
  • 事务 B 开始,获取max(id) + 1新的 id(比如 101)。
  • 事务 A 提交。
  • 事务 B 尝试提交 - 砰!它不能 - 你有重复的 id 101。

(而不是max(id)+1你可以使用count(*)+1- 结果将是相同的)。

尝试重用漏洞也不起作用:

  • 事务 A 开始,获取 id 作为自动增量(比如 101)。
  • 事务 B 开始,获取 id 作为自动增量(比如 102)。
  • 事务 B 提交。
  • 事务 A 因某些奇怪的原因中止(例如客户端丢失连接)。现在,id 101 将不再使用。如果您尝试重复使用它,它将非常昂贵。

为了让这幅图更复杂,想象一下不是 2 个,而是说 10 个并发事务同时工作?

换句话说,停止与之抗争并接受它。

于 2013-10-26T01:02:27.440 回答