千家信息网

MySQL怎么复制表

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容介绍了"MySQL怎么复制表"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.MySQL中的
千家信息网最后更新 2026年11月02日MySQL怎么复制表

本篇内容介绍了"MySQL怎么复制表"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1.MySQL中的外键

1)只能用于InnoDB表。
2)父表可以在另一个数据库中。
3)父表中被参照的字段只要有索引就行,可以存在重复的值。
4)在"foreign key (colname) references tabname (colname)"后面加上on delete cascade,可以实现级联删除。
注:除了CASCADE,delete后面还可以跟着SET NULL,RESTRICT,NO ACTION等关键字。另外,还可以使用on update子句实现级联更新,且两者可以同时使用,这里不再赘述。

[@more@]
2.表类型

MyISAM和InnoDB是MySQL中最重要的表类型。一个MyISAM表在文件系统中有三个对应的文件(tabname.frm, tabname.MYD, tabname.MYI),而一个InnoDB表则只有一个对应的文件(tabname.frm)。

1)MyISAM

MyISAM延伸了基本的ISAM类型,它可以在不同的操作系统和平台之间进行移植,支持大表文件(大于4GB),允许对BLOB和TEXT列进行索引,可以对表和表索引进行压缩(这个特性对于BLOB和TEXT字段很实用)。它还可以约束VARCHAR字段的长度,或者自动根据数据的情况进行动态调节,支持使用键前缀和使用完整的键搜索记录。
MySQL启动时会自动检查MyISAM表以防止崩溃,甚至可以在出现错误时进行修复。表数据文件和表索引文件可以存储在不同的位置,甚至不同的文件系统中。即使进行大量的插入、更新和删除操作的表,智能防碎片逻辑也能保证其高性能的协作性。

2)InnoDB

InnoDB是MySQL 5.1中的默认表类型,它完全兼容ACID,又拥有可以与MyISAM媲美的性能,完全支持MySQL的事务处理并且不会降低速度或性能,它也可以在不同的操作系统和体系结构之间移植。InnoDB提供行级和表级锁定,也支持无锁定读操作(类似Oracle)和多版本。另外,它还提供对外键、提交、回顾和前滚的操作的支持。
InnoDB支持在需要时自动在内存中创建散列索引来提高性能,还使用缓冲来提高可靠性和数据库操作的速度。异步输入/输出和一系列的读缓冲提高了数据检索的速度,"伙伴算法"和Oracle类型的表空间可以进行文件的优化和内存的管理。

此外,还有ISAM(主要是兼容旧版本)、HEAP(在内存中创建的临时表)、BerkleyDB、MERGE(多个MyISAM表组合成一个单独的表)等类型。


3.其他表修饰符

除了TYPE外,还可以指定许多其他属性来控制创建表的操作。

属性 描述
AUTO_INCREMENT 第一次向AUTO_INCREMENT字段插入的值
CHECKSUM 是否储存表校验和(布尔值)
COMMENT 表的描述性注释
MAX_ROWS 表中存储的最大行数
MIN_ROWS 表中存储的最小行数
PACK_KEYS 是否压缩表索引(布尔值)
UNION 映射到一个单独的MERGE表的表
DATA DIRECTORY 表数据文件的位置
INDEX DIRECTORY 表索引文件的位置


4.复制表

MySQL中可以结合CREATE TABLE和SELECT语句来复制表。例如:

mysql> create table test_crttb
-> (
-> id tinyint(3),
-> name varchar(15),
-> primary key (id)
-> );
Query OK, 0 rows affected (0.10 sec)

mysql> insert into test_crttb values (1, 'Adam');
Query OK, 1 row affected (0.04 sec)

mysql> insert into test_crttb values (2, 'Bob');
Query OK, 1 row affected (0.03 sec)

mysql> insert into test_crttb values (3, 'Clark');
Query OK, 1 row affected (0.03 sec)

mysql> select * from test_crttb;
+----+-------+
| id | name |
+----+-------+
| 1 | Adam |
| 2 | Bob |
| 3 | Clark |
+----+-------+
3 rows in set (0.00 sec)

mysql> create table test_crttb2 select * from test_crttb;
Query OK, 3 rows affected (0.52 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> select * from test_crttb;
+----+-------+
| id | name |
+----+-------+
| 1 | Adam |
| 2 | Bob |
| 3 | Clark |
+----+-------+
3 rows in set (0.00 sec)

注意,select紧跟在"create table ..."后面,前面没有as,这一点和Oracle不同。

可以添加一个不成立的where条件,来创建一个结构相同的空表:

mysql> desc test_crttb;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | tinyint(3) | NO | PRI | 0 | |
| name | varchar(15) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.02 sec)

mysql> desc test_crttb3;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | tinyint(3) | NO | | 0 | |
| name | varchar(15) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.03 sec)

但是,这种方法只能复制表本身,表上的键需要手动创建。要在复制表的同时复制表上的键,可以使用下面的方法:

mysql> create table test_crttb4 like test_crttb;
Query OK, 0 rows affected (0.13 sec)

mysql> show create table test_crttb;
+------------+------------------------------------------------------------------
--------------------------------------------------------------------------------
------------------+
| Table | Create Table

|
+------------+------------------------------------------------------------------
--------------------------------------------------------------------------------
------------------+
| test_crttb | CREATE TABLE `test_crttb` (
`id` tinyint(3) NOT NULL DEFAULT '0',
`name` varchar(15) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+------------+------------------------------------------------------------------
--------------------------------------------------------------------------------
------------------+
1 row in set (0.00 sec)

mysql> show create table test_crttb4;
+-------------+-----------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------+
| Table | Create Table

|
+-------------+-----------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------+
| test_crttb4 | CREATE TABLE `test_crttb4` (
`id` tinyint(3) NOT NULL DEFAULT '0',
`name` varchar(15) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------------+-----------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------+
1 row in set (0.00 sec)

这样,就创建一个结构相同的空表,并带有原表上的键。这时可以向其中插入原表中的记录:

mysql> insert into test_crttb4 select * from test_crttb;
Query OK, 3 rows affected (0.24 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> select * from test_crttb4;
+----+-------+
| id | name |
+----+-------+
| 1 | Adam |
| 2 | Bob |
| 3 | Clark |
+----+-------+
3 rows in set (0.00 sec)

还可以创建一个既包含原表中的列,又包含新的列的"混合表":

mysql> create table test_crttb5
-> (
-> tel smallint(15)
-> )
-> select * from test_crttb;
Query OK, 3 rows affected (0.16 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> select * from test_crttb5;
+------+----+-------+
| tel | id | name |
+------+----+-------+
| NULL | 1 | Adam |
| NULL | 2 | Bob |
| NULL | 3 | Clark |
+------+----+-------+
3 rows in set (0.00 sec)

使用alter table语句的first和after子句可以调整字段的位置:

mysql> alter table test_crttb5 modify id tinyint(3) first;
Query OK, 3 rows affected (0.65 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> desc test_crttb5;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | tinyint(3) | YES | | NULL | |
| tel | smallint(15) | YES | | NULL | |
| name | varchar(15) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

mysql> alter table test_crttb5 modify tel smallint(15) after name;
Query OK, 3 rows affected (0.56 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> desc test_crttb5;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | tinyint(3) | YES | | NULL | |
| name | varchar(15) | YES | | NULL | |
| tel | smallint(15) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

"MySQL怎么复制表"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

文件 数据 类型 索引 支持 不同 字段 位置 系统 内存 性能 结构 速度 存储 实用 相同 操作系统 之间 内容 同时 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技创新互联网企业 壕鑫互联网络科技 互联网金融 科技创新 互联网高科技企业 互联网巨头投资的硬核科技 互联网企业和科技型企业 宁夏科技产业互联网案例 玉溪互联网科技怎么选 开一家科技互联网公司需要多少钱 迪庆互联网科技招生 高科技互联网发展前景如何 滨湖区互联网智能科技产品有哪些 互联网科技圈年度人物 每天都有哪些好的互联网科技 上海创道互联网络科技有限公司 半导体行业属于互联网高科技类吗 互联网高科技行业有哪些企业 互联网科技手抄报图片 西安左小互联网科技有限公司 广西泛欧互联网科技有限公司 小米移动互联网科技园 湖北九亚互联网络科技有限公司 银优互联网科技有限公司 善班互联网科技有限公司 互联网科技生活的内容 互联网金融中的现代科技 特约风豹互联网科技为什么扣费 宇信科技在杭州互联网排第几 互联网科技接地气 西安左小互联网科技有限公司
0