MySQL怎么复制表

62次阅读
没有评论

共计 6215 个字符,预计需要花费 16 分钟才能阅读完成。

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

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 怎么复制表”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注丸趣 TV 网站,丸趣 TV 小编将为大家输出更多高质量的实用文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-17发表,共计6215字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)