温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

MySQL怎么复制表

发布时间:2021-12-04 09:49:31 来源:亿速云 阅读:139 作者:iii 栏目: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怎么复制表”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI