【问题标题】:How to sort a table by a column name permanently in DB2 [duplicate]如何在DB2中永久按列名对表进行排序[重复]
【发布时间】:2019-04-08 06:53:39
【问题描述】:

我想按列名“EmpID”对表“Employee”进行排序,并将这些更改持久化。

这是我的员工表。 'EmpID' 是主键。

EmpID    EmpName  City

Ram       234     HYD   
Shyam     130     BLR 
Madan     894     KAN 
Ramesh    101     CHN 

所以我写了一个sql查询

Select * FROM Employee ORDER BY EmpID ASC;   


        EmpID    EmpName  City

        Ramesh    101     CHN 
        Shyam     130     BLR
        Ram       234     HYD  
        Madan     894     KAN  

但它只生成排序格式的结果集,但实际表格不会永久更改。

现在当我运行 Select * FROM Employee 时,我再次得到原始表,而不是更新后的表。

Select * FROM Employee;

            EmpID    EmpName  City

            Ram       234     HYD   
            Shyam     130     BLR 
            Madan     894     KAN 
            Ramesh    101     CHN 

那么如何做到这一点呢?

【问题讨论】:

  • 为什么要关心数据在表中的存储方式?
  • @EstebanP.:这是一个要求。我正在对该表运行一些操作,因为我希望每次执行插入时该表都处于排序状态。我想找出具有最大值的行。插入前的员工 ID。我也在做随机插入和删除。
  • 查看此问答 [SQL best practice to deal with default sort order ](stackoverflow.com/a/1793161/9602361)。
  • I want to find out the row having max. employee Id before insertion. I am also doing random insertions and deletions. 为什么?如果您这样做是为了找到“下一个可用的 id”,这意味着您需要从读取查询中锁定整个表,直到 INSERT 完成,否则您将面临重复行的风险(希望您在列上有一个唯一键)。我也怀疑删除员工记录,而不是让它们处于非活动状态或其他什么 - 仅仅因为它们可能不适合你,并不意味着你不再有关系
  • @Clockwork-Muse :我需要删除记录,因为我正在测试数据库的可伸缩性以及多线程。无论如何找出最大值并使用 max+1 插入新记录解决了我的问题。关闭线程。谢谢。

标签: sql db2


【解决方案1】:

我认为您在这里遗漏了一些基本的数据库原则。存储引擎实际上并没有有序记录的概念,它只是根据插入顺序存储数据,然后按照它认为最合适的方式将数据写入磁盘。

您“可以”尝试通过遍历结果集并将数据逐行插入到新表中来保留数据,但即使这样也无法保证您的订单。这意味着您每次添加/删除记录时都必须重复此操作。

确实没有正当理由想要操纵数据的持久化方式。如果您在该表上运行依赖于按 empId 排序的数据的操作,则需要以这样的方式编写操作,以便它们使用 order by 子句检索数据。

【讨论】:

  • 请看我上面对 EstebanP 的回复
  • 我做到了,因此我的最后一段。这不是一个合法的要求,因为它违背了数据库的基本原理。您无法控制引擎如何存储您的数据。您只能控制使用 SQL 检索该数据的方式。如果您想找出最大员工 ID,则只需使用 'SELECT MAX(empId) FROM Employee'。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2020-06-09
  • 1970-01-01
  • 2015-11-14
  • 2019-09-08
  • 1970-01-01
相关资源
最近更新 更多