1 回答
TA贡献1865条经验 获得超7个赞
查询
您要求的查询是:
INSERT INTO `table_name_new` (`color`, `date`)
SELECT `color`, `date` FROM `table_name` ORDER BY `date`;
此处的进一步文档描述了 MySQL 中类似操作的其他变体。
但正如许多评论所说,不建议id在定义后乱七八糟。您的代码的其他一些部分可能期望id具有特定含义。ORDER BY另外,在需要时使用子句重新排序记录非常简单。
因此,除非您确定这id在您的整个代码库中绝对是微不足道的/毫无意义的,否则建议您不要进行这种操作。
请慎重考虑。
如何防止手动构建列列表以仅省略 1 列?
不幸的是,没有 MySQL 语法直接支持通过定义要省略的列来选择表列。但是,我们可以构建自己的 SQL 查询以供其他 MySQL 查询运行。
假设,
您有正确的权限;和
您已经在正确的数据库中;
然后,
--
-- Build a comma separated column list (omitting "`id`," and ",`id`")
-- as session variable "@columns"
--
-- @column would be "`color`,`date`" for the example table in our question.
--
SET @columns = (
SELECT
REPLACE(REPLACE(GROUP_CONCAT(CONCAT('`', COLUMN_NAME, '`')), '`id`,', ''), ',`id`', '')
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'table_name' AND TABLE_SCHEMA = (SELECT DATABASE())
);
--
-- Build a SQL query string @sql according to @columns
--
SET @sql = CONCAT(
'INSERT INTO `table_name_new` (',
@columns,
') SELECT ',
@columns,
' FROM `table_name` ORDER BY date;'
);
--
-- Prepare and execute the SQL statement
--
PREPARE stmt1 FROM @sql;
EXECUTE stmt1;
- 1 回答
- 0 关注
- 139 浏览
添加回答
举报