共计 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 小编将为大家输出更多高质量的实用文章!