【问题标题】:varchar column sorted by itselfvarchar 列自行排序
【发布时间】:2013-05-04 06:23:16
【问题描述】:

我有带有列的表,有些列是 varchar。我注意到表中的行是自动排序的。相反,我希望行的顺序与插入表中的顺序相同。有什么线索吗?请注意,我没有应用任何 ORDER BY 子句,并且列的日期都相同。

很明显,虽然我首先添加了 Testing Book 3,但它自动位于 Testing Book 2 下方,这是不希望的。

是不是因为我的PK是复合的?

【问题讨论】:

  • 添加一个自动递增的 ID 列作为 PK。
  • 不能那样做,我的表结构不允许我那样做。我已经在一组列上指定了 PK。
  • 您指定的复合 PK 中有哪些列?
  • 表中的行不会自动排序 - 事实上,在 SQL Server 表中,根本就没有固有的排序顺序。 SQL Server 中的数据未排序 - 只有您的输出可以排序 - 当且仅当您提供 ORDER BY 子句。
  • 复合键 invoice_ID(数字)、invoice_account(varchar)、invoice_item(varchar)

标签: c# sql sql-server wpf visual-studio-2010


【解决方案1】:

您没有具体说明您使用的是哪个 RDBMS,但关于 Microsoft SQL Server,我可以说如下:

  1. 如果没有 ORDER BY 子句,您无法保证任何可预测/可重复的排序

  2. 1234563 GETDATE() 或 GETUTCDATE() AND ORDER BY 这个新字段
  3. 新字段与 PK 无关。这是参考其他人提出的建议。 PK 用于关系,而不是排序,虽然 IDENTITY 通常用于 PK,但在很多情况下,具有一个或多个非自增字段的 PK 并且仍然具有自增字段。

  4. 如果您需要关于插入记录的毫秒/纳秒以及保证/可重复排序的详细信息,请同时对 DATETIME / DATETIME2 和 IDENTITY 字段进行操作。

  5. 添加这些字段中的一个或两个并不意味着任何特定的索引结构。它们的存在仅允许您创建一个或多个索引,其中包含它们以强制执行您想要的排序。

【讨论】:

  • 还有一个问题。我一次插入一些行,所以它们会有相同的日期时间,那么我该如何订购它们呢?
  • 如果它们确实是同时插入的,那么根据您的标准,这些行的顺序无关紧要。
  • @SamarthAgarwal,我同意 Ben 的观点,如果它们同时插入并且您希望它们按该顺序插入,那么插入的两(或更多)行之间确实没有区别相同的毫秒(或纳秒,如果使用 DATETIME2)。 然而,如果你想要一个可预测/可重复的排序,那么这就是为什么我还建议添加一个标记为 IDENTITY 的 INT / BIGINT 字段而不是 DATETIME / DATETIME2 字段。如果您需要有关插入记录的毫秒数以及可重复排序的详细信息,请同时在 DATETIME 和 IDENTITY 字段中进行操作。
  • 好吧,我假设是相同的但是它们在插入后立即进行排序。注意:如果我删除 Composite PK,一切正常。有什么线索吗?
  • @SamarthAgarwal:不,当您删除 PK 时它无法正常工作。您只是看到行的顺序基于几个可能都发生变化的因素。这就是为什么我一直强调保证可重复。您看到的不是排序,而是符合您期望的巧合排序。一旦数据足够大,可能会导致优化器选择并行计划,您将看到相当“奇怪”的排序。这就是您需要 ORDER BY 子句的原因。结尾。的。故事。放回 PK,添加 1 或 2 个字段,并在 ORDER BY 中使用它/它们。没有别的办法。
【解决方案2】:

请注意,SQL 不保证插入或选择行时的顺序。 您可以看到类似问题的答案here

我将通过插入进行排序的方式是添加 DATETIME 列,该列获取插入时的日期/时间值。
(如何做到这一点您可以在接受的答案中看到 @987654322 @)

然后在选择期间在 DATETIME 列上进行排序

【讨论】:

    猜你喜欢
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    相关资源
    最近更新 更多