更新ID而不是选择,删除和插入?

时间:2011-08-12 23:31:05

标签: php mysql optimization

我想要做的是运行一个选择某些mysql条目的PHP脚本,然后将它们移动到表格的顶部(或者只是在插入时自动递增id列)。

说明:我有一个包含100个条目的表。进入49和条目88必须像这样更新:删除条目49,所有数据仍然在表中,插入,但ID为101。

对于条目88,

相同:删除/更新具有值88的id列的行,更新新条目/相同条目,其ID为102,但数据相同。

此外,脚本运行后不会出现重复ID等问题,需要一个对mysql友好的解决方案。

你明白了吗?

我的问题是:如何以最有效和最简单的方式完成这项工作?

我想到的唯一选择是很长并且似乎不必要地复杂:选择整行,删除它,插入包含所有数据的新行并让id自动递增...

如果有人愿意与我分享他们对此事的看法,我将非常感激!

其他信息:脚本将每天运行一次,功能强大的apache专用服务器。不需要优化,要求简单解决方案的问题要求一种简单的方法来处理我的问题,而不需要那么努力工作。


感谢大家的帮助!我感谢你的每一句答案和评论!我认为这个问题不能比我上面说的更简单,使用一块PHP,我现在正在关闭这个问题。我再次说,感谢所有回答的人!如果您想要解决问题或者使用php,请在这里回答我会阅读它,或者至少我们可能会帮助将来阅读此主题的任何其他人,假设2012年不会带来世界末日......在这种情况下,没有人会再阅读这个帖子了,你也可能不会发帖...但我想认为未来是我们的决定:P ...再次感谢大家!干杯!

3 个答案:

答案 0 :(得分:2)

你知道UPDATE类型的查询太对了吗?

警告!前面是纯粹的邪恶!

UPDATE `table`
SET `field1`='value1', `field2` = 'value2', `id`=LAST_INSERTED_ID()+1
WHERE `id` = 49;

为什么Pure Evil警告?您永远不能永远 EVER EVER 更改现有条目的ID,因为它必将搞乱您的表。最后一个代码是纯理论,不推荐使用。

Manual Reference

答案 1 :(得分:1)

我发现了一篇解释A Point In Time database design的文章。本文介绍如何使用triggers来实现设计。您可以使用此解决方案创建一个触发器,而不是删除,更新ID。

如前所述,弄乱你的ID是非常危险的,并且肯定会迟早损坏你的数据。

答案 2 :(得分:1)

我真的不知道你为什么需要它,但这是我认为最好的查询:

UPDATE %table% SET id = (SELECT Auto_increment FROM information_schema.tables WHERE table_schema = DATABASE() && table_name = '%table%') WHERE id = %id%

如果你想确保数据库不会搞砸,请使用事务(InnoDB)或LOCK(MyISAM)

InnoDB的

START TRANSACTION;
UPDATE %table% SET id = (SELECT Auto_increment FROM information_schema.tables

WHERE table_schema = DATABASE()&& table_name ='%table%')WHERE id =%id%;     COMMIT;

的MyISAM

LOCK TABLES %table% WRITE;
UPDATE %table% SET id = (SELECT Auto_increment FROM information_schema.tables

WHERE table_schema = DATABASE()&& table_name ='%table%')WHERE id =%id%;     解锁表格;