是否可以重新排序sql表行?
我有大约8000行,他们有点乱,因为日期与id相比无序,我知道你可以通过删除和重新添加id(INT auto imp)来重置顺序但我想重新订购按日期。
我知道我可以简单地从脚本中“订购日期”,但我宁愿“订购ID”并拥有一个干净的DB ......
我猜它是一个UPDATE ...查询并且已经搜索了高位和低位以获得答案,但还没有找到它。
答案 0 :(得分:1)
我不同意你的目标,但我认为你可以编写一个程序:
答案 1 :(得分:0)
我真的不同意这个目标,但是。
在SQL Server 2005+中,您可以使用它。一次执行它会保持表约束,默认值等完整,同时仍然遵守其他表中的所有外键挂钩。
create table badlyordered( id int identity, date datetime, otherdata varchar(100))
insert badlyordered(date) select getdate()+4
insert badlyordered(date) select getdate()+2
insert badlyordered(date) select getdate()+3
insert badlyordered(date) select getdate()
insert badlyordered(date) select getdate()+10
insert badlyordered(date) select getdate()-10
update badlyordered set otherdata = date
select * from badlyordered order by id
id date otherdata
----------- ----------------------- ---------------------
7 2011-02-21 18:51:55.087 Feb 21 2011 6:51PM
8 2011-02-19 18:51:55.087 Feb 19 2011 6:51PM
9 2011-02-20 18:51:55.087 Feb 20 2011 6:51PM
10 2011-02-17 18:51:55.087 Feb 17 2011 6:51PM
11 2011-02-27 18:51:55.087 Feb 27 2011 6:51PM
12 2011-02-07 18:51:55.087 Feb 7 2011 6:51PM
;with tmp as (
select *,
table_seq = row_number() over (order by id),
nice_seq = row_number() over (order by date, id)
from badlyordered
)
update t1
set date = t2.date
,otherdata = t2.otherdata
-- and any other columns in the table
from tmp t1
inner join tmp t2 on t1.table_seq=t2.nice_seq
select * from badlyordered order by id
id date otherdata
----------- ----------------------- ---------------------
7 2011-02-07 18:51:55.087 Feb 7 2011 6:51PM
8 2011-02-17 18:51:55.087 Feb 17 2011 6:51PM
9 2011-02-19 18:51:55.087 Feb 19 2011 6:51PM
10 2011-02-20 18:51:55.087 Feb 20 2011 6:51PM
11 2011-02-21 18:51:55.087 Feb 21 2011 6:51PM
12 2011-02-27 18:51:55.087 Feb 27 2011 6:51PM
但我知道你在使用MySQL。你可以在MySQL中使用变量进行两次行编号,然后使用行号来执行更新。
这将生成与SQL Server中的CTE相同的数据。
select ..(rownumber variable by date).. from
(
select ..(rownumber variable by id).. from tbl order by id
) n
然后你需要2(!)个
select n.id, o.id
from
(
select ..(rownumber variable by date).. from
(
select ..(rownumber variable by id).. from tbl order by id
) n
inner join
select ..(rownumber variable by date).. from
(
select ..(rownumber variable by id).. from tbl order by id
) n
on ....
) o
生成从原始到目标的更新ID的映射。最后,您需要使用UPDATE FROM JOIN
MySQL技术将表连接到这组ID以执行更新。
答案 2 :(得分:0)
用于什么ID?您似乎没有更改ID的问题,但如果它引用其他地方将是一个问题。如果未在其他地方引用它,那么您可能需要重新考虑数据库设计,因为列可能会消失。
如果您仍想这样做,您是否可以创建一个带有标识列的新表并插入没有id列的行数据,删除旧表并使用旧表的名称重命名新表。