【问题标题】:How to insert rows in reverse order?如何以相反的顺序插入行?
【发布时间】:2019-02-04 12:28:28
【问题描述】:

我要做的是将一个表的行复制到另一个表。我有 2 种选择可以直接或反向复制它们。我对直接订购没有任何问题。但我无法以相反的顺序插入它们。我正在尝试使用 ORDER BY DESC,但 DESC 不适用于子查询。所以我用声明来做。并且 SELECT 按 PRIMARY KEY 以相反的顺序返回我。但是数据库 my_db_copy 中的数据是直接插入的。如何以相反的顺序插入它们?

set @Query1=Concat ('INSERT INTO my_db_copy.test1 SELECT * FROM my_db.test1 
ORDER BY ', (   SELECT COLUMN_NAME
FROM information_schema.COLUMNS
WHERE (TABLE_SCHEMA = 'my_db')
  AND (TABLE_NAME = 'test1')
  AND (COLUMN_KEY = 'PRI')), ' DESC');
  PREPARE stmt FROM @Query1;
  EXECUTE stmt;    

【问题讨论】:

  • @Query1 这里的结果值是多少?当您从结果查询中删除 INSERT 子句并仅执行带有 ORDER BYSELECT 时,观察到的结果顺序是什么?这与您的预期有何不同?您向我们展示的代码是从您提出的问题中删除的几个步骤。
  • @David 如果我从集合中删除 INSERT,它将显示相反的顺序,但不会以相反的顺序插入。
  • 你为什么这么认为?如果这是结果的顺序,那么这就是它们被使用的顺序。您以后按什么顺序选择目标表的结果来观察它们?如果您没有指定一个,则不能保证任何订单。听起来你在这里做假设。
  • @David 查看结果 我选择它们时没有任何顺序,我的意思是我不按顺序排列。没有任何排序依据的查询的默认顺序是什么?
  • 虽然不能保证,但“默认”顺序通常很可能是主键,因为这通常是集群索引和数据库引擎在磁盘上存储记录的物理顺序.

标签: mysql sql insert row sql-insert


【解决方案1】:

SQL 表代表无序 集合。没有所谓的“颠倒”顺序。

可以将值分配给自动递增的列以指定特定的顺序。

如果您希望在发出查询时按特定顺序获得结果,则需要显式包含order by。没有其他方法可以保证结果集按特定顺序。

【讨论】:

  • 感谢您的回答。但是如果我有 ID 为 1 2 3 4 5 的表,但如果我想将它们复制到另一个 ID 为 5 4 3 2 1 的表中。该怎么做?
  • @rdhd 。 . .我建议您问 另一个 问题,并附上样本数据和期望的结果。但请记住这里的第一条信息:表格是无序的
猜你喜欢
  • 2018-11-30
  • 1970-01-01
  • 2015-11-09
  • 1970-01-01
  • 2016-10-05
  • 1970-01-01
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多