【发布时间】: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 BY的SELECT时,观察到的结果顺序是什么?这与您的预期有何不同?您向我们展示的代码是从您提出的问题中删除的几个步骤。 -
@David 如果我从集合中删除 INSERT,它将显示相反的顺序,但不会以相反的顺序插入。
-
你为什么这么认为?如果这是结果的顺序,那么这就是它们被使用的顺序。您以后按什么顺序选择目标表的结果来观察它们?如果您没有指定一个,则不能保证任何订单。听起来你在这里做假设。
-
@David 查看结果 我选择它们时没有任何顺序,我的意思是我不按顺序排列。没有任何排序依据的查询的默认顺序是什么?
-
虽然不能保证,但“默认”顺序通常很可能是主键,因为这通常是集群索引和数据库引擎在磁盘上存储记录的物理顺序.
标签: mysql sql insert row sql-insert