【问题标题】:Trigger to sort and update table in SQL Server触发器在 SQL Server 中对表进行排序和更新
【发布时间】:2018-12-03 03:53:56
【问题描述】:

我有一个这样的表,Id 是主键,所以显然这些表是按 Id 排序的。

+----+----------+--------+
| Id |  OrderNo |  Col2  |
+----+----------+--------+
|  1 |        3 | Value3 |
|  2 |        1 | Value1 |
|  3 |        2 | Value2 |
+----+----------+--------+

我要做的是在OrderNo 每次新插入后重新排序表格,如下所示:

+----+----------+--------+
| Id |  OrderNo |  Col2  |
+----+----------+--------+
|  2 |        1 | Value1 |
|  3 |        2 | Value2 |
|  1 |        3 | Value3 |
|  4 |        4 | Value4 |
+----+----------+--------+

这可能吗?我查看了this question,它说要删除并重新创建表。无论如何,我可以一口气完成吗?

事实上,我尝试在接受的答案中执行第一个查询,但 SSMS 给了我一个错误。

【问题讨论】:

  • 制作OrderId主键,表格会自动排序。
  • 表格数据通常不遵循任何特定的顺序,因为它并不重要。您应该在 SELECT 查询中使用 ORDER BY 子句来获得所需的顺序。
  • 重新排序表本身是一个错误的要求。您不关心数据库内部如何存储数据。在 SELECT 查询中使用 ORDER BY。这将为您提供每次所需的东西。
  • 有没有办法去掉主键自动重排序和另一列排序?
  • RDBMS 中的表本质上是一个 无序 数据包 - 即使将 Id 作为您的主键,它也是 NOT 排序的钥匙!不断地“重新排序”表格没有任何意义,也没有任何好处——你只是在浪费你的资源。在 RDBMS 中获得排序的唯一方法是通过SELECT从表中指定一个显式 ORDER BY

标签: sql sql-server


【解决方案1】:

使用视图以您喜欢的任何方式对数据进行排序,而与输入的内容无关。

【讨论】:

  • 不——正如马克所说,一张桌子没有内在的顺序。视图实际上是一个虚拟表,您不能对视图进行排序。如果行的顺序很重要,则生成结果集的查询必须必须包含 order by 子句。在视图中使用 order by 子句的唯一方法是使用 top 指令。为了使其普遍有用,您必须使用“前 100%”——优化器会忽略它。
猜你喜欢
  • 2012-03-13
  • 2016-11-03
  • 2011-06-03
  • 1970-01-01
  • 2018-07-07
  • 2011-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多