创建新表没有重复的行,保留原始顺序

时间:2012-11-07 20:33:39

标签: php mysql

MySQL表只有5个字段,但有数百行。有了很好的建议(tks Lacoz)我重复了表,同时忽略了重复的行,现在有了一个不包含重复行的新表。

问题:新表是以加扰顺序输入的(即,当观察第一个字段时,称为rel_id)。虽然这在现实世界中无关紧要,但在这一点上以相同的顺序(参考过去的注释等)会有所帮助。

示例行:(请注意,rel_id是一个自动递增的主键字段)

'rel_id' => 1
'host' => 17
'host_type' => 'client'
'rep' => 7
'rep_type => 'cli_mgr'

以下是用户Lacoz帮助我创建新表的方法,没有重复:

mysql_query("create table rels2 like rels");
mysql_query("alter table rels2 add unique index(host,host_type,rep,rep_type)");
mysql_query("insert IGNORE into rels2 select * from rels");

我尝试在最终查询中添加“ORDER BY”,如下所示:

mysql_query("insert IGNORE into rels2 select * from rels ORDER BY rel_id");

但它没有解决问题。行仍处于扰乱状态。

第一个问题:为什么会这样?

第二个问题:我怎样才能确保数据以正确的顺序输入?

必要的结果:出于各种原因,我确实需要将数据恢复到以前的外观(但没有重复)。有人可以建议另一种方法,甚至是PHP脚本来实现这个目标吗?

PS:经过多次谷歌搜索后,我认为不可能对表格的原始数据进行排序,只对输出进行排序。正确? (很难确定一个概念和术语的新手 - 我们都必须从某个地方开始)。

2 个答案:

答案 0 :(得分:1)

从概念上讲,关系数据库中的数据不以任何特定顺序存储。在数学上,它是一个集合或关系,集合没有排序。这就是为什么SQL没有提供以某种顺序插入行的任何方法(例如,在末尾插入此行,在开头,在其他行之后插入等等)。它只提供了一种根据指定的排序标准过滤查询输出的方法。

当然,SQL的具体实现最终必须以某种顺序将内容存储在磁盘上,这就是为什么在查询表而没有给出ORDER BY子句时会注意到可重复排序的原因,但是你可以不要指望它。您的软件应该假定行将以任意顺序出现。

如果您需要以特定顺序显示结果,请在查询中使用ORDER BY。也许构建一个合适的索引(如果还没有),以确保数据库能够以良好的性能生成您请求的顺序。

答案 1 :(得分:0)

由于您设法通过添加唯一索引来解决重复问题,因此如果您希望它们是auto_increment,则必须加载新的主键值。所以建议的查询就是这个

mysql_query("insert IGNORE into rels2(host,host_type,rep,rep_type) select host,host_type,rep,rep_type from rels ORDER BY rel_id");

祝你好运!

相关问题