一个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:经过几次谷歌搜索后,我认为不可能对表的原始数据进行排序,只能对输出进行排序。对,是这样?(当一个新手同时了解概念和术语时,很难确定-我们都必须从某个地方开始)。
发布于 2012-11-08 04:41:56
从概念上讲,关系数据库中的数据不会以任何特定的顺序存储。从数学上讲,它是一个集合或关系,并且集合没有顺序。这就是为什么SQL不提供任何按特定顺序插入行的方法(例如,在末尾插入此行,在开始插入行,在其他行之后插入行,等等)。它只提供了一种在给定某些指定排序条件的情况下过滤查询输出的方法。
当然,SQL的具体实现最终必须以某种顺序将数据存储在磁盘上,这就是为什么在不给出ORDER BY子句的情况下查询表时会注意到可重复排序的原因,但您不能指望它。您的软件应该假设行将以任意顺序出现。
如果需要以特定顺序显示结果,请在查询中使用ORDER BY。也许可以构建一个适当的索引(如果还没有的话),以确保数据库能够以良好的性能生成您所请求的排序。
发布于 2012-11-08 05:04:50
由于您设法通过添加唯一索引解决了重复问题,因此如果希望主键值为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");
祝好运!
https://stackoverflow.com/questions/13277735
复制相似问题