2012-01-06 29 views
4

例如:中间删除一行,如何刷新表ID(自动递增)在MySQL

Row Name 
1 John 
2 May 
3 Marry 
4 Tom 
5 Peter 

想我删除的行2和第3行是它能够更新汤姆和彼得行ID分别为2和3,下一个插入行为行ID 4?

+0

你可以尝试使用那种触发器o情况 – Gerep 2012-01-06 15:01:33

+0

什么是触发器? – red23jordan 2012-01-06 15:29:14

+0

触发器是一个数据库代码,将根据某些数据库事件自动执行。检查这里的更多细节,我假设你正在使用MySQL:http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html – Gerep 2012-01-06 15:31:40

回答

1

不,因为想想这可能产生的问题。试想一下,如果您正在管理商店库存,并且每个商品都有一个内部条形码,则基于数据库表中的ID。您决定不再购买一件商品并将其从数据库中取出,然后ID大于已移除商品的每件商品的ID都减1 ......所有这些商品上的所有条码都变得毫无用处。

数据库中的ID号通常不用于人们使用或引用。它们旨在成为数据库中某个项目的静态索引,以便计算机快速可靠地提取给定记录。在创建表的ID字段时,请确保您的数据类型足够大,以便在发生这些丢失的ID时对其进行解释。

+0

嗯,这是可能的,它是否应该是完成是一个不同的问题。很好的解释。 – Nikoloff 2012-01-06 15:00:08

+0

我认为他想要的是定价值,所以没有问题,因为他专门为这种情况创建了一个新列 – Gerep 2012-01-06 15:00:45

+0

@Nikoloff是的,公平点,但我认为他正在寻找一个设置,即自动增量会自动为他做,而不是Elen下面给出的答案,这当然会起作用。 – 2012-01-06 15:04:00

2

是的,但你需要重新创建行:

ALTER TABLE `users` DROP `Row`; 
ALTER TABLE `users` AUTO_INCREMENT = 1; 
ALTER TABLE `users` ADD `Row` int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST; 
0

这仅仅是一个建议。我不认为这是最好的解决方案。请考虑。

您执行您的删除查询。

DELETE FROM table_name WHERE Row IN (2,3); 

一旦删除,您将使用PHP进行选择查询请求,并将数据集设置为数组。

SELECT Row, Name from table_name ORDER BY Row ASC; 

然后使用循环进行UPDATE执行。

$index = 1; 
foreach($dataset as $item) 
{ 
// Your update query 
$sql = "UPDATE table_name SET Row=$index where Name='" . $item['Name'] . "'"; 
$index++; 
} 

在插入下一个查询之前,您必须获取Row的最大值并将+1值设置为插入查询的行。 这只是一个想法。不是完整的代码。

相关问题