MySQL往期文章
mysql1> 安装与管理,安装,管理

| mysql2> PHP语法,mysql连接

| mysql3> 创建数据库,删除数据库,选择数据库

| mysq7> 元数据,序列使用,处理重复数据,及SQL注入,导出数据,导入数据

| | mysql4> 数据类型,创建数据表,删除数据表,插入数据,查询数据

| mysql5> where子句,UPDATE查询,DELETE语句,LIKE子句,排序,Join的使用

| mysql6> Null值处理,正则表达式,事务,ALTER命令,索引,临时表,复制表

| |

MySQL NULL 值处理

我们已经知道MySQL使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL时,该命令可能就无法正常工作。
为了处理这种情况,MySQL提供了三大运算符:

  • **IS NULL**: 当列的值是NULL,此运算符返回true
  • **IS NOT NULL**: 当列的值不为NULL, 运算符返回true
  • **<=>**: 比较操作符(不同于=运算符),当比较的的两个值为NULL时返回true

关于 NULL的条件比较运算是比较特殊的。你不能使用= NULL!= NULL 在列中查找 NULL值 。
在MySQL中,NULL值与任何其它值的比较(即使是NULL)永远返回false,即 NULL = NULL 返回false
MySQL中处理NULL使用IS NULLIS NOT NULL运算符。

在命令提示符中使用 NULL 值

以下实例中假设数据库 TUTORIALS 中的表 tcount_tbl含有两列tutorial_authortutorial_count, tutorial_count 中设置插入NULL值。

实例

尝试以下实例:

  1. root@host# mysql -u root -p password;
  2. Enter password:*******
  3. mysql> use TUTORIALS;
  4. Database changed
  5. mysql> create table tcount_tbl
  6. -> (
  7. -> tutorial_author varchar(40) NOT NULL,
  8. -> tutorial_count INT
  9. -> );
  10. Query OK, 0 rows affected (0.05 sec)
  11. mysql> INSERT INTO tcount_tbl
  12. -> (tutorial_author, tutorial_count) values ('mahran', 20);
  13. mysql> INSERT INTO tcount_tbl
  14. -> (tutorial_author, tutorial_count) values ('mahnaz', NULL);
  15. mysql> INSERT INTO tcount_tbl
  16. -> (tutorial_author, tutorial_count) values ('Jen', NULL);
  17. mysql> INSERT INTO tcount_tbl
  18. -> (tutorial_author, tutorial_count) values ('Gill', 20);
  19. mysql> SELECT * from tcount_tbl;
  20. +-----------------+----------------+
  21. | tutorial_author | tutorial_count |
  22. +-----------------+----------------+
  23. | mahran | 20 |
  24. | mahnaz | NULL |
  25. | Jen | NULL |
  26. | Gill | 20 |
  27. +-----------------+----------------+
  28. 4 rows in set (0.00 sec)
  29. mysql>

以下实例中你可以看到 =!=运算符是不起作用的:

  1. mysql> SELECT * FROM tcount_tbl WHERE tutorial_count = NULL;
  2. Empty set (0.00 sec)
  3. mysql> SELECT * FROM tcount_tbl WHERE tutorial_count != NULL;
  4. Empty set (0.01 sec)

查找数据表中 tutorial_count 列是否为 NULL,必须使用IS NULL和IS NOT NULL,如下实例:

  1. mysql> SELECT * FROM tcount_tbl
  2. -> WHERE tutorial_count IS NULL;
  3. +-----------------+----------------+
  4. | tutorial_author | tutorial_count |
  5. +-----------------+----------------+
  6. | mahnaz | NULL |
  7. | Jen | NULL |
  8. +-----------------+----------------+
  9. 2 rows in set (0.00 sec)
  10. mysql> SELECT * from tcount_tbl
  11. -> WHERE tutorial_count IS NOT NULL;
  12. +-----------------+----------------+
  13. | tutorial_author | tutorial_count |
  14. +-----------------+----------------+
  15. | mahran | 20 |
  16. | Gill | 20 |
  17. +-----------------+----------------+
  18. 2 rows in set (0.00 sec)

使用PHP脚本处理 NULL 值

PHP脚本中你可以在 if...else语句来处理变量是否为空,并生成相应的条件语句。
以下实例中PHP设置了$tutorial_count变量,然后使用该变量与数据表中的tutorial_count字段进行比较:

  1. <?php
  2. $dbhost = 'localhost:3036';
  3. $dbuser = 'root';
  4. $dbpass = 'rootpassword';
  5. $conn = mysql_connect($dbhost, $dbuser, $dbpass);
  6. if(! $conn )
  7. {
  8. die('Could not connect: ' . mysql_error());
  9. }
  10. if( isset($tutorial_count ))
  11. {
  12. $sql = 'SELECT tutorial_author, tutorial_count
  13. FROM tcount_tbl
  14. WHERE tutorial_count = $tutorial_count';
  15. }
  16. else
  17. {
  18. $sql = 'SELECT tutorial_author, tutorial_count
  19. FROM tcount_tbl
  20. WHERE tutorial_count IS $tutorial_count';
  21. }
  22. mysql_select_db('TUTORIALS');
  23. $retval = mysql_query( $sql, $conn );
  24. if(! $retval )
  25. {
  26. die('Could not get data: ' . mysql_error());
  27. }
  28. while($row = mysql_fetch_array($retval, MYSQL_ASSOC))
  29. {
  30. echo "Author:{$row['tutorial_author']} <br> ".
  31. "Count: {$row['tutorial_count']} <br> ".
  32. "--------------------------------<br>";
  33. }
  34. echo "Fetched data successfully\n";
  35. mysql_close($conn);
  36. ?>

MySQL 正则表达式

在前面的章节我们已经了解到MySQL可以通过**LIKE ...%**来进行模糊匹配。
MySQL 同样也支持其他正则表达式的匹配, MySQL中使用REGEXP操作符来进行正则表达式匹配。
如果您了解PHP或Perl,那么操作起来就非常简单,因为MySQL的正则表达式匹配与这些脚本的类似。
下表中的正则模式可应用于REGEXP 操作符中。

模式 描述
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。
. 匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用象 ‘[.\n]’ 的模式。
[…] 字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。
[^…] 负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’。
p1|p2|p3 匹配 p1 或 p2 或 p3。例如,’z|food’ 能匹配 “z” 或 “food”。’(z|f)ood’ 则匹配 “zood” 或 “food”。
* 匹配前面的子表达式零次或多次。例如,zo 能匹配 “z” 以及 “zoo”。 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。

实例

了解以上的正则需求后,我们就可以更加自己的需求来编写带有正则表达式的SQL语句。以下我们将列出几个小实例(表名:person_tbl)来加深我们的理解:
查找name字段中以'st'为开头的所有数据:

  1. mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';

查找name字段中以'ok'为结尾的所有数据:

  1. mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';

查找name字段中包含'mar'字符串的所有数据:

  1. mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';

查找name字段中以元音字符开头且以'ok'字符串结尾的所有数据:

  1. mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';

MySQL 事务

MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

  • 在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务
  • 事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行
  • 事务用来管理insert,update,delete语句

一般来说,事务是必须满足4个条件(ACID): Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)

  • 1、事务的原子性:一组事务,要么成功;要么撤回。
  • 2、稳定性 : 有非法数据(外键约束之类),事务撤回。
  • 3、隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。
  • 4、可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得,innodb_flush_log_at_trx_commit选项 决定什么时候吧事务保存到日志里。

    在Mysql控制台使用事务来操作

    1,开始一个事务
    1. start transaction
    2, 做保存点
    1. save point 保存点名称
    3, 操作
    4,可以回滚,可以提交,没有问题,就提交,有问题就回滚。

    PHP中使用事务实例

    1. <?php
    2. $handler=mysql_connect("localhost","root","password");
    3. mysql_select_db("task");
    4. mysql_query("SET AUTOCOMMIT=0");//设置为不自动提交,因为MYSQL默认立即执行
    5. mysql_query("BEGIN");//开始事务定义
    6. if(!mysql_query("insert into trans (id) values('2')"))
    7. {
    8. mysql_query("ROOLBACK");//判断当执行失败时回滚
    9. }
    10. if(!mysql_query("insert into trans (id) values('4')"))
    11. {
    12. mysql_query("ROOLBACK");//判断执行失败回滚
    13. }
    14. mysql_query("COMMIT");//执行事务
    15. mysql_close($handler);
    16. ?>

    MySQL ALTER命令

    当我们需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令。
    开始本章教程前让我们先创建一张表,表名为:testalter_tbl
    1. root@host# mysql -u root -p password;
    2. Enter password:*******
    3. mysql> use TUTORIALS;
    4. Database changed
    5. mysql> create table testalter_tbl
    6. -> (
    7. -> i INT,
    8. -> c CHAR(1)
    9. -> );
    10. Query OK, 0 rows affected (0.05 sec)
    11. mysql> SHOW COLUMNS FROM testalter_tbl;
    12. +-------+---------+------+-----+---------+-------+
    13. | Field | Type | Null | Key | Default | Extra |
    14. +-------+---------+------+-----+---------+-------+
    15. | i | int(11) | YES | | NULL | |
    16. | c | char(1) | YES | | NULL | |
    17. +-------+---------+------+-----+---------+-------+
    18. 2 rows in set (0.00 sec)

    删除,添加或修改表字段

    如下命令使用了 ALTER命令及 DROP 子句来删除以上创建表的i字段:
    1. mysql> ALTER TABLE testalter_tbl DROP i;
    如果数据表中只剩余一个字段则无法使用DROP来删除字段。
    MySQL 中使用ADD子句来想数据表中添加列,如下实例在表testalter_tbl中添加 i字段,并定义数据类型:
    1. mysql> ALTER TABLE testalter_tbl ADD i INT;
    执行以上命令后,i 字段会自动添加到数据表字段的末尾。
    1. mysql> SHOW COLUMNS FROM testalter_tbl;
    2. +-------+---------+------+-----+---------+-------+
    3. | Field | Type | Null | Key | Default | Extra |
    4. +-------+---------+------+-----+---------+-------+
    5. | c | char(1) | YES | | NULL | |
    6. | i | int(11) | YES | | NULL | |
    7. +-------+---------+------+-----+---------+-------+
    8. 2 rows in set (0.00 sec)
    如果你需要指定新增字段的位置,可以使用MySQL提供的关键字FIRST (设定位第一列), AFTER字段名(设定位于某个字段之后)。
    尝试以下ALTER TABLE语句, 在执行成功后,使用 SHOW COLUMNS 查看表结构的变化: ```php ALTER TABLE testalter_tbl DROP i; ALTER TABLE testalter_tbl ADD i INT FIRST; ALTER TABLE testalter_tbl DROP i; ALTER TABLE testalter_tbl ADD i INT AFTER c;
  1. `FIRST ` `AFTER` 关键字只占用于 `ADD` 子句,所以如果你想重置数据表字段的位置就需要先使用 `DROP` 删除字段然后使用 `ADD `来添加字段并设置位置。
  2. <a name="hI3zx"></a>
  3. ## 修改字段类型及名称
  4. 如果需要修改字段类型及名称, 你可以在`ALTER`命令中使用` MODIFY `` CHANGE `子句 。<br />例如,把字段` c` 的类型从 `CHAR(1) `改为 `CHAR(10)`,可以执行以下命令:
  5. ```php
  6. mysql> ALTER TABLE testalter_tbl MODIFY c CHAR(10);

使用 CHANGE子句, 语法有很大的不同。 在 CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段的类型及名称。尝试如下实例:

  1. mysql> ALTER TABLE testalter_tbl CHANGE i j BIGINT;

如果你现在想把字段 j=""="" bigint=""修改为="" int,sql语句如下:<="" p="">

  1. mysql> ALTER TABLE testalter_tbl CHANGE j j INT;

ALTER TABLE 对 Null 值和默认值的影响

当你修改字段时,你可以指定是否包含只或者是否设置默认值。
以下实例,指定字段jNOT NULL 且默认值为100

  1. mysql> ALTER TABLE testalter_tbl
  2. -> MODIFY j BIGINT NOT NULL DEFAULT 100;

如果你不设置默认值,MySQL会自动设置该字段默认为 NULL

修改字段默认值

你可以使用ALTER来修改字段的默认值,尝试以下实例:

  1. mysql> ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
  2. mysql> SHOW COLUMNS FROM testalter_tbl;
  3. +-------+---------+------+-----+---------+-------+
  4. | Field | Type | Null | Key | Default | Extra |
  5. +-------+---------+------+-----+---------+-------+
  6. | c | char(1) | YES | | NULL | |
  7. | i | int(11) | YES | | 1000 | |
  8. +-------+---------+------+-----+---------+-------+
  9. 2 rows in set (0.00 sec)

你也可以使用 ALTER 命令及DROP子句来删除字段的默认值,如下实例:

  1. mysql> ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
  2. mysql> SHOW COLUMNS FROM testalter_tbl;
  3. +-------+---------+------+-----+---------+-------+
  4. | Field | Type | Null | Key | Default | Extra |
  5. +-------+---------+------+-----+---------+-------+
  6. | c | char(1) | YES | | NULL | |
  7. | i | int(11) | YES | | NULL | |
  8. +-------+---------+------+-----+---------+-------+
  9. 2 rows in set (0.00 sec)
  10. Changing a Table Type:

修改数据表类型,可以使用 ALTER命令及TYPE 子句来完成。尝试以下实例,我们将表 testalter_tbl的类型修改为MYISAM
注意:查看数据表类型可以使用 SHOW TABLE STATUS语句。

  1. mysql> ALTER TABLE testalter_tbl TYPE = MYISAM;
  2. mysql> SHOW TABLE STATUS LIKE 'testalter_tbl'\G
  3. *************************** 1\. row ****************
  4. Name: testalter_tbl
  5. Type: MyISAM
  6. Row_format: Fixed
  7. Rows: 0
  8. Avg_row_length: 0
  9. Data_length: 0
  10. Max_data_length: 25769803775
  11. Index_length: 1024
  12. Data_free: 0
  13. Auto_increment: NULL
  14. Create_time: 2007-06-03 08:04:36
  15. Update_time: 2007-06-03 08:04:36
  16. Check_time: NULL
  17. Create_options:
  18. Comment:
  19. 1 row in set (0.00 sec)

修改表名

如果需要修改数据表的名称,可以在 ALTER TABLE 语句中使用RENAME 子句来实现。
尝试以下实例将数据表 testalter_tbl 重命名为alter_tbl

  1. mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl;

ALTER 命令还可以用来创建及删除MySQL数据表的索引,该功能我们会在接下来的章节中介绍。

MySQL 索引

MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。
索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。
创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。
实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERTUPDATEDELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
建立索引会占用磁盘空间的索引文件。

普通索引

创建索引

这是最基本的索引,它没有任何限制。它有以下几种创建方式:

  1. CREATE INDEX indexName ON mytable(username(length));

如果是CHARVARCHAR类型,length可以小于字段实际长度;
如果是BLOBTEXT类型,必须指定length

修改表结构

  1. ALTER mytable ADD INDEX [indexName] ON (username(length))

创建表的时候直接指定

  1. CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) );

删除索引的语法

  1. DROP INDEX [indexName] ON mytable;

唯一索引

它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

创建索引

  1. CREATE UNIQUE INDEX indexName ON mytable(username(length))

修改表结构

  1. ALTER mytable ADD UNIQUE [indexName] ON (username(length))

创建表的时候直接指定

  1. CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) );

使用ALTER 命令添加和删除索引

有四种方式来添加数据表的索引:

  • **ALTER TABLE tbl_name ADD PRIMARY KEY (column_list)**: 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
  • **ALTER TABLE tbl_name ADD UNIQUE index_name (column_list)**: 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
  • **ALTER TABLE tbl_name ADD INDEX index_name (column_list)**: 添加普通索引,索引值可出现多次。
  • ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。

以下实例为在表中添加索引。

  1. mysql> ALTER TABLE testalter_tbl ADD INDEX (c);

你还可以在ALTER 命令中使用 DROP 子句来删除索引。尝试以下实例删除索引:

  1. mysql> ALTER TABLE testalter_tbl DROP INDEX (c);

使用 ALTER 命令添加和删除主键

主键只能作用于一个列上,添加主键索引时,你需要确保该主键默认不为空(NOT NULL)。实例如下:

  1. mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
  2. mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);

你也可以使用 ALTER命令删除主键:

  1. mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;

删除指定时只需指定PRIMARY KEY,但在删除索引时,你必须知道索引名。

显示索引信息

你可以使用 SHOW INDEX 命令来列出表中的相关的索引信息。可以通过添加\G 来格式化输出信息。
尝试以下实例:

  1. mysql> SHOW INDEX FROM table_name\G
  2. ........

MySQL 临时表

MySQL 临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。
临时表在MySQL 3.23版本中添加,如果你的MySQL版本低于 3.23版本就无法使用MySQL的临时表。不过现在一般很少有再使用这么低版本的MySQL数据库服务了。
MySQL临时表只在当前连接可见,如果你使用PHP脚本来创建MySQL临时表,那没当PHP脚本执行完成后,该临时表也会自动销毁。
如果你使用了其他MySQL客户端程序连接MySQL数据库服务器来创建临时表,那么只有在关闭客户端程序时才会销毁临时表,当然你也可以手动销毁。

实例

以下展示了使用MySQL 临时表的简单实例,以下的SQL代码可以适用于PHP脚本的mysql_query()函数。

  1. mysql> CREATE TEMPORARY TABLE SalesSummary (
  2. -> product_name VARCHAR(50) NOT NULL
  3. -> , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00
  4. -> , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00
  5. -> , total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
  6. );
  7. Query OK, 0 rows affected (0.00 sec)
  8. mysql> INSERT INTO SalesSummary
  9. -> (product_name, total_sales, avg_unit_price, total_units_sold)
  10. -> VALUES
  11. -> ('cucumber', 100.25, 90, 2);
  12. mysql> SELECT * FROM SalesSummary;
  13. +--------------+-------------+----------------+------------------+
  14. | product_name | total_sales | avg_unit_price | total_units_sold |
  15. +--------------+-------------+----------------+------------------+
  16. | cucumber | 100.25 | 90.00 | 2 |
  17. +--------------+-------------+----------------+------------------+
  18. 1 row in set (0.00 sec)

当你使用**SHOW TABLES**命令显示数据表列表时,你将无法看到SalesSummary表。
如果你退出当前MySQL会话,再使用 **SELECT**命令来读取原先创建的临时表数据,那你会发现数据库中没有该表的存在,因为在你退出时该临时表已经被销毁了。

删除MySQL 临时表

默认情况下,当你断开与数据库的连接后,临时表就会自动被销毁。当然你也可以在当前MySQL会话使用 **DROP TABLE** 命令来手动删除临时表。
以下是手动删除临时表的实例:

  1. mysql> CREATE TEMPORARY TABLE SalesSummary (
  2. -> product_name VARCHAR(50) NOT NULL
  3. -> , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00
  4. -> , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00
  5. -> , total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
  6. );
  7. Query OK, 0 rows affected (0.00 sec)
  8. mysql> INSERT INTO SalesSummary
  9. -> (product_name, total_sales, avg_unit_price, total_units_sold)
  10. -> VALUES
  11. -> ('cucumber', 100.25, 90, 2);
  12. mysql> SELECT * FROM SalesSummary;
  13. +--------------+-------------+----------------+------------------+
  14. | product_name | total_sales | avg_unit_price | total_units_sold |
  15. +--------------+-------------+----------------+------------------+
  16. | cucumber | 100.25 | 90.00 | 2 |
  17. +--------------+-------------+----------------+------------------+
  18. 1 row in set (0.00 sec)
  19. mysql> DROP TABLE SalesSummary;
  20. mysql> SELECT * FROM SalesSummary;
  21. ERROR 1146: Table 'TUTORIALS.SalesSummary' doesn't exist

MySQL 复制表

如果我们需要完全的复制MySQL的数据表,包括表的结构,索引,默认值等。 如果仅仅使用**CREATE TABLE ... SELECT**命令,是无法实现的。
本章节将为大家介绍如何完整的复制MySQL数据表,步骤如下:

  • 使用 **SHOW CREATE TABLE** 命令获取创建数据表(**CREATE TABLE**) 语句,该语句包含了原数据表的结构,索引等。
  • 复制以下命令显示的SQL语句,修改数据表名,并执行SQL语句,通过以上命令 将完全的复制数据表结构。
  • 如果你想复制表的内容,你就可以使用**INSERT INTO ... SELECT**语句来实现。

    实例

    尝试以下实例来复制表 tutorials_tbl
    步骤一:
    获取数据表的完整结构。 ```php mysql> SHOW CREATE TABLE tutorials_tbl \G; * 1. row *
    1. Table: tutorials_tbl
    Create Table: CREATE TABLE tutorials_tbl ( tutorial_id int(11) NOT NULL auto_increment, tutorial_title varchar(100) NOT NULL default ‘’, tutorial_author varchar(40) NOT NULL default ‘’, submission_date date default NULL, PRIMARY KEY (tutorial_id), UNIQUE KEY AUTHOR_INDEX (tutorial_author) ) TYPE=MyISAM 1 row in set (0.00 sec)

ERROR: No query specified

  1. **步骤二:**<br />修改SQL语句的数据表名,并执行SQL语句。
  2. ```php
  3. mysql> CREATE TABLE `clone_tbl` (
  4. -> `tutorial_id` int(11) NOT NULL auto_increment,
  5. -> `tutorial_title` varchar(100) NOT NULL default '',
  6. -> `tutorial_author` varchar(40) NOT NULL default '',
  7. -> `submission_date` date default NULL,
  8. -> PRIMARY KEY (`tutorial_id`),
  9. -> UNIQUE KEY `AUTHOR_INDEX` (`tutorial_author`)
  10. -> ) TYPE=MyISAM;
  11. Query OK, 0 rows affected (1.80 sec)

步骤三:
执行完第二步骤后,你将在数据库中创建新的克隆表 clone_tbl。 如果你想拷贝数据表的数据你可以使用**INSERT INTO... SELECT** 语句来实现。

  1. mysql> INSERT INTO clone_tbl (tutorial_id,
  2. -> tutorial_title,
  3. -> tutorial_author,
  4. -> submission_date)
  5. -> SELECT tutorial_id,tutorial_title,
  6. -> tutorial_author,submission_date,
  7. -> FROM tutorials_tbl;
  8. Query OK, 3 rows affected (0.07 sec)
  9. Records: 3 Duplicates: 0 Warnings: 0

执行以上步骤后,你将完整的复制表,包括表结构及表数据。
'Attr.nodeValue' is deprecated. Please use 'value' instead. adsbygoogle.js:32