SQL Server表 - 更新Order by

时间:2011-04-10 11:00:37

标签: sql sql-server

我有一个SQL Server表,其中包含字段:id, city, country。我从Excel文件导入了此表,所有内容都已成功导入,但id字段未按编号排序。我使用的工具导入了一些随机数的行。

我应该使用哪种更新命令从SQL Server Management Studio Express重新订购我的ID?

4 个答案:

答案 0 :(得分:0)

只需使用select语句的部分顺序来订购它们。

答案 1 :(得分:0)

您的桌面上是否有主键和聚簇索引?如果不是,id是主键的良好候选者,当您创建主键时,它将成为聚簇索引。

假设这是你的表

create table CityCountry(id int, city varchar(10), country varchar(10))

你添加这样的数据。

insert into CityCountry values (2, '2', '')
insert into CityCountry values (1, '1', '')
insert into CityCountry values (4, '4', '')
insert into CityCountry values (3, '3', '')

select * from CityCountry的输出将是

id          city       country
----------- ---------- ----------
2           2          
1           1          
4           4          
3           3  

作为主键的列不能接受空值,因此首先必须执行

alter table CityCountry alter column id int not null

然后您可以添加主键

alter table CityCountry add primary key (id)

当你select * from CityCountry时,你得到了

id          city       country
----------- ---------- ----------
1           1          
2           2          
3           3          
4           4      

答案 2 :(得分:0)

如果我理解正确,你希望所有id都有连续的数字1,2,3,4 ......

图像表格内容为:

select *
  from yourTable

id          city       country
----------- ---------- ----------
1           Madrid     Spain
3           Lisbon     Portugal
7           Moscow     Russia
10          Brasilia   Brazil

(4 row(s) affected)

要重新排序ID,只需运行:

declare @counter int = 0

update yourTable
   set @counter = id = @counter + 1

(4 row(s) affected)

您现在可以检查,确实所有ID都已重新排序:

select *
  from yourTable

id          city       country
----------- ---------- ----------
1           Madrid     Spain
2           Lisbon     Portugal
3           Moscow     Russia
4           Brasilia   Brazil

(4 row(s) affected)

但是,你需要小心这一点。如果某个表具有此id列的外键,则需要先禁用该FK,更新此表,更新其他表中具有FK指向yourTable的值,最后再次启用FK

答案 3 :(得分:0)

首先,我认为您可能对Id列的目的存在一些误解。 Id列可能是代理键;即一个永远不会向用户显示的唯一且非空的任意值。因此,不应暗示具有任何继承意义或顺序。实际上,您应始终使用另一列标记为唯一的列来表示“业务键”或用户唯一的一组值。在您的情况下,city, country应该是唯一的(尽管您可能需要添加省或州,因为在同一个国家/地区同时存在多个相同的城市。)

现在,如果满足以下条件,则可以对您的ID进行重新排序:

  1. Id列不是标识列。由于这是来自导入,我猜这是真的。
  2. 与未启用Cascade Update的表格不存在关系。
  3. 您正在使用SQL Express 2005或更高版本:
  4. Update MyTable
    Set Id = T2.NewId
    From    (
            Select Id
                , Row_Number() Over ( Order By Id ) As NewId
            From MyTable
            ) As T1
        Join MyTable As T2
            On T2.Id = T1.Id