MySQL如何创建无索引临时表?LIKE创建带索引问题及解决方案
咱们一步步来解决你的MySQL临时表问题:
问题1:如何创建不带任何索引或键的MySQL临时表
有两种常用的方式可以实现:
- 手动定义字段创建:直接写
CREATE TEMPORARY TABLE语句,只声明字段类型,不添加任何PRIMARY KEY、UNIQUE、INDEX等约束,示例:CREATE TEMPORARY TABLE temp_no_index ( id INT, username VARCHAR(50), email VARCHAR(100) ); - 基于现有表复制结构(不带索引):如果想复用已有表的字段结构,但不带索引,别用
LIKE,改用SELECT ... LIMIT 0的方式,这种方式只会复制字段类型,不会继承任何索引或约束:CREATE TEMPORARY TABLE temp_no_index SELECT * FROM your_existing_table LIMIT 0;
问题2:LIKE创建的临时表带索引的原因及解决办法
为什么会带索引?
你之前的认知有误哦——CREATE TABLE ... LIKE的作用是完全复刻原表的所有结构细节,包括索引、唯一约束、存储引擎、字符集、甚至注释,这和是不是临时表无关,哪怕是创建普通表,用LIKE也会原样复制索引。所以你用CREATE TEMPORARY TABLE person_tmp LIKE person时,自然会把原表的unique_lstanme唯一键复制过来。
怎么避免这种情况?
有两个方案可选:
- 改用SELECT方式创建:就是问题1里提到的
CREATE TEMPORARY TABLE ... SELECT ... LIMIT 0,示例:
这样只会复制CREATE TEMPORARY TABLE person_tmp SELECT * FROM person LIMIT 0;person表的字段结构,不会带任何索引或约束。 - 先创建再删除索引:如果一定要用
LIKE创建,之后再手动删除索引。
有没有无需指定索引名就能删除所有索引的命令?
MySQL没有直接的“一键删除所有索引”的内置命令,但可以通过查询系统表生成批量删除语句,步骤如下:
- 执行以下SQL生成删除语句(会自动排除主键,如果需要删主键就去掉
AND index_name != 'PRIMARY'):SELECT CONCAT('DROP INDEX ', index_name, ' ON person_tmp;') AS drop_index_sql FROM information_schema.STATISTICS WHERE table_schema = DATABASE() AND table_name = 'person_tmp' AND index_name != 'PRIMARY'; - 把查询结果里的
drop_index_sql列的语句复制出来,批量执行即可。
注意:临时表仅存在于当前会话,所以只有当前会话能查询到
information_schema.STATISTICS里的临时表信息,切换会话就查不到了。
内容的提问来源于stack exchange,提问作者membersound
相关产品推荐
相关产品推荐

