| 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 NULL和IS NOT NULL运算符。
在命令提示符中使用 NULL 值
以下实例中假设数据库 TUTORIALS 中的表 tcount_tbl含有两列tutorial_author和 tutorial_count, tutorial_count 中设置插入NULL值。
实例
尝试以下实例:
root@host# mysql -u root -p password;Enter password:*******mysql> use TUTORIALS;Database changedmysql> create table tcount_tbl-> (-> tutorial_author varchar(40) NOT NULL,-> tutorial_count INT-> );Query OK, 0 rows affected (0.05 sec)mysql> INSERT INTO tcount_tbl-> (tutorial_author, tutorial_count) values ('mahran', 20);mysql> INSERT INTO tcount_tbl-> (tutorial_author, tutorial_count) values ('mahnaz', NULL);mysql> INSERT INTO tcount_tbl-> (tutorial_author, tutorial_count) values ('Jen', NULL);mysql> INSERT INTO tcount_tbl-> (tutorial_author, tutorial_count) values ('Gill', 20);mysql> SELECT * from tcount_tbl;+-----------------+----------------+| tutorial_author | tutorial_count |+-----------------+----------------+| mahran | 20 || mahnaz | NULL || Jen | NULL || Gill | 20 |+-----------------+----------------+4 rows in set (0.00 sec)mysql>
以下实例中你可以看到 =和!=运算符是不起作用的:
mysql> SELECT * FROM tcount_tbl WHERE tutorial_count = NULL;Empty set (0.00 sec)mysql> SELECT * FROM tcount_tbl WHERE tutorial_count != NULL;Empty set (0.01 sec)
查找数据表中 tutorial_count 列是否为 NULL,必须使用IS NULL和IS NOT NULL,如下实例:
mysql> SELECT * FROM tcount_tbl-> WHERE tutorial_count IS NULL;+-----------------+----------------+| tutorial_author | tutorial_count |+-----------------+----------------+| mahnaz | NULL || Jen | NULL |+-----------------+----------------+2 rows in set (0.00 sec)mysql> SELECT * from tcount_tbl-> WHERE tutorial_count IS NOT NULL;+-----------------+----------------+| tutorial_author | tutorial_count |+-----------------+----------------+| mahran | 20 || Gill | 20 |+-----------------+----------------+2 rows in set (0.00 sec)
使用PHP脚本处理 NULL 值
PHP脚本中你可以在 if...else语句来处理变量是否为空,并生成相应的条件语句。
以下实例中PHP设置了$tutorial_count变量,然后使用该变量与数据表中的tutorial_count字段进行比较:
<?php$dbhost = 'localhost:3036';$dbuser = 'root';$dbpass = 'rootpassword';$conn = mysql_connect($dbhost, $dbuser, $dbpass);if(! $conn ){die('Could not connect: ' . mysql_error());}if( isset($tutorial_count )){$sql = 'SELECT tutorial_author, tutorial_countFROM tcount_tblWHERE tutorial_count = $tutorial_count';}else{$sql = 'SELECT tutorial_author, tutorial_countFROM tcount_tblWHERE tutorial_count IS $tutorial_count';}mysql_select_db('TUTORIALS');$retval = mysql_query( $sql, $conn );if(! $retval ){die('Could not get data: ' . mysql_error());}while($row = mysql_fetch_array($retval, MYSQL_ASSOC)){echo "Author:{$row['tutorial_author']} <br> "."Count: {$row['tutorial_count']} <br> "."--------------------------------<br>";}echo "Fetched data successfully\n";mysql_close($conn);?>
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'为开头的所有数据:
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';
查找name字段中以'ok'为结尾的所有数据:
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
查找name字段中包含'mar'字符串的所有数据:
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';
查找name字段中以元音字符开头且以'ok'字符串结尾的所有数据:
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,开始一个事务
2, 做保存点start transaction
3, 操作save point 保存点名称
4,可以回滚,可以提交,没有问题,就提交,有问题就回滚。PHP中使用事务实例
<?php$handler=mysql_connect("localhost","root","password");mysql_select_db("task");mysql_query("SET AUTOCOMMIT=0");//设置为不自动提交,因为MYSQL默认立即执行mysql_query("BEGIN");//开始事务定义if(!mysql_query("insert into trans (id) values('2')")){mysql_query("ROOLBACK");//判断当执行失败时回滚}if(!mysql_query("insert into trans (id) values('4')")){mysql_query("ROOLBACK");//判断执行失败回滚}mysql_query("COMMIT");//执行事务mysql_close($handler);?>
MySQL ALTER命令
当我们需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令。
开始本章教程前让我们先创建一张表,表名为:testalter_tbl。root@host# mysql -u root -p password;Enter password:*******mysql> use TUTORIALS;Database changedmysql> create table testalter_tbl-> (-> i INT,-> c CHAR(1)-> );Query OK, 0 rows affected (0.05 sec)mysql> SHOW COLUMNS FROM testalter_tbl;+-------+---------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+---------+------+-----+---------+-------+| i | int(11) | YES | | NULL | || c | char(1) | YES | | NULL | |+-------+---------+------+-----+---------+-------+2 rows in set (0.00 sec)
删除,添加或修改表字段
如下命令使用了ALTER命令及DROP子句来删除以上创建表的i字段:
如果数据表中只剩余一个字段则无法使用mysql> ALTER TABLE testalter_tbl DROP i;
DROP来删除字段。
MySQL 中使用ADD子句来想数据表中添加列,如下实例在表testalter_tbl中添加i字段,并定义数据类型:
执行以上命令后,i 字段会自动添加到数据表字段的末尾。mysql> ALTER TABLE testalter_tbl ADD i INT;
如果你需要指定新增字段的位置,可以使用MySQL提供的关键字mysql> SHOW COLUMNS FROM testalter_tbl;+-------+---------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+---------+------+-----+---------+-------+| c | char(1) | YES | | NULL | || i | int(11) | YES | | NULL | |+-------+---------+------+-----+---------+-------+2 rows in set (0.00 sec)
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;
`FIRST `和 `AFTER` 关键字只占用于 `ADD` 子句,所以如果你想重置数据表字段的位置就需要先使用 `DROP` 删除字段然后使用 `ADD `来添加字段并设置位置。<a name="hI3zx"></a>## 修改字段类型及名称如果需要修改字段类型及名称, 你可以在`ALTER`命令中使用` MODIFY `或` CHANGE `子句 。<br />例如,把字段` c` 的类型从 `CHAR(1) `改为 `CHAR(10)`,可以执行以下命令:```phpmysql> ALTER TABLE testalter_tbl MODIFY c CHAR(10);
使用 CHANGE子句, 语法有很大的不同。 在 CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段的类型及名称。尝试如下实例:
mysql> ALTER TABLE testalter_tbl CHANGE i j BIGINT;
如果你现在想把字段 j="" 从="" bigint=""修改为="" int,sql语句如下:<="" p="">
mysql> ALTER TABLE testalter_tbl CHANGE j j INT;
ALTER TABLE 对 Null 值和默认值的影响
当你修改字段时,你可以指定是否包含只或者是否设置默认值。
以下实例,指定字段j 为 NOT NULL 且默认值为100 。
mysql> ALTER TABLE testalter_tbl-> MODIFY j BIGINT NOT NULL DEFAULT 100;
如果你不设置默认值,MySQL会自动设置该字段默认为 NULL。
修改字段默认值
你可以使用ALTER来修改字段的默认值,尝试以下实例:
mysql> ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;mysql> SHOW COLUMNS FROM testalter_tbl;+-------+---------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+---------+------+-----+---------+-------+| c | char(1) | YES | | NULL | || i | int(11) | YES | | 1000 | |+-------+---------+------+-----+---------+-------+2 rows in set (0.00 sec)
你也可以使用 ALTER 命令及DROP子句来删除字段的默认值,如下实例:
mysql> ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;mysql> SHOW COLUMNS FROM testalter_tbl;+-------+---------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+---------+------+-----+---------+-------+| c | char(1) | YES | | NULL | || i | int(11) | YES | | NULL | |+-------+---------+------+-----+---------+-------+2 rows in set (0.00 sec)Changing a Table Type:
修改数据表类型,可以使用 ALTER命令及TYPE 子句来完成。尝试以下实例,我们将表 testalter_tbl的类型修改为MYISAM :
注意:查看数据表类型可以使用 SHOW TABLE STATUS语句。
mysql> ALTER TABLE testalter_tbl TYPE = MYISAM;mysql> SHOW TABLE STATUS LIKE 'testalter_tbl'\G*************************** 1\. row ****************Name: testalter_tblType: MyISAMRow_format: FixedRows: 0Avg_row_length: 0Data_length: 0Max_data_length: 25769803775Index_length: 1024Data_free: 0Auto_increment: NULLCreate_time: 2007-06-03 08:04:36Update_time: 2007-06-03 08:04:36Check_time: NULLCreate_options:Comment:1 row in set (0.00 sec)
修改表名
如果需要修改数据表的名称,可以在 ALTER TABLE 语句中使用RENAME 子句来实现。
尝试以下实例将数据表 testalter_tbl 重命名为alter_tbl:
mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl;
ALTER 命令还可以用来创建及删除MySQL数据表的索引,该功能我们会在接下来的章节中介绍。
MySQL 索引
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。
索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。
创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。
实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
建立索引会占用磁盘空间的索引文件。
普通索引
创建索引
这是最基本的索引,它没有任何限制。它有以下几种创建方式:
CREATE INDEX indexName ON mytable(username(length));
如果是CHAR,VARCHAR类型,length可以小于字段实际长度;
如果是BLOB和TEXT类型,必须指定length。
修改表结构
ALTER mytable ADD INDEX [indexName] ON (username(length))
创建表的时候直接指定
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) );
删除索引的语法
DROP INDEX [indexName] ON mytable;
唯一索引
它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
创建索引
CREATE UNIQUE INDEX indexName ON mytable(username(length))
修改表结构
ALTER mytable ADD UNIQUE [indexName] ON (username(length))
创建表的时候直接指定
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 ,用于全文索引。
以下实例为在表中添加索引。
mysql> ALTER TABLE testalter_tbl ADD INDEX (c);
你还可以在ALTER 命令中使用 DROP 子句来删除索引。尝试以下实例删除索引:
mysql> ALTER TABLE testalter_tbl DROP INDEX (c);
使用 ALTER 命令添加和删除主键
主键只能作用于一个列上,添加主键索引时,你需要确保该主键默认不为空(NOT NULL)。实例如下:
mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
你也可以使用 ALTER命令删除主键:
mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;
删除指定时只需指定PRIMARY KEY,但在删除索引时,你必须知道索引名。
显示索引信息
你可以使用 SHOW INDEX 命令来列出表中的相关的索引信息。可以通过添加\G 来格式化输出信息。
尝试以下实例:
mysql> SHOW INDEX FROM table_name\G........
MySQL 临时表
MySQL 临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。
临时表在MySQL 3.23版本中添加,如果你的MySQL版本低于 3.23版本就无法使用MySQL的临时表。不过现在一般很少有再使用这么低版本的MySQL数据库服务了。
MySQL临时表只在当前连接可见,如果你使用PHP脚本来创建MySQL临时表,那没当PHP脚本执行完成后,该临时表也会自动销毁。
如果你使用了其他MySQL客户端程序连接MySQL数据库服务器来创建临时表,那么只有在关闭客户端程序时才会销毁临时表,当然你也可以手动销毁。
实例
以下展示了使用MySQL 临时表的简单实例,以下的SQL代码可以适用于PHP脚本的mysql_query()函数。
mysql> CREATE TEMPORARY TABLE SalesSummary (-> product_name VARCHAR(50) NOT NULL-> , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00-> , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00-> , total_units_sold INT UNSIGNED NOT NULL DEFAULT 0);Query OK, 0 rows affected (0.00 sec)mysql> INSERT INTO SalesSummary-> (product_name, total_sales, avg_unit_price, total_units_sold)-> VALUES-> ('cucumber', 100.25, 90, 2);mysql> SELECT * FROM SalesSummary;+--------------+-------------+----------------+------------------+| product_name | total_sales | avg_unit_price | total_units_sold |+--------------+-------------+----------------+------------------+| cucumber | 100.25 | 90.00 | 2 |+--------------+-------------+----------------+------------------+1 row in set (0.00 sec)
当你使用**SHOW TABLES**命令显示数据表列表时,你将无法看到SalesSummary表。
如果你退出当前MySQL会话,再使用 **SELECT**命令来读取原先创建的临时表数据,那你会发现数据库中没有该表的存在,因为在你退出时该临时表已经被销毁了。
删除MySQL 临时表
默认情况下,当你断开与数据库的连接后,临时表就会自动被销毁。当然你也可以在当前MySQL会话使用 **DROP TABLE** 命令来手动删除临时表。
以下是手动删除临时表的实例:
mysql> CREATE TEMPORARY TABLE SalesSummary (-> product_name VARCHAR(50) NOT NULL-> , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00-> , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00-> , total_units_sold INT UNSIGNED NOT NULL DEFAULT 0);Query OK, 0 rows affected (0.00 sec)mysql> INSERT INTO SalesSummary-> (product_name, total_sales, avg_unit_price, total_units_sold)-> VALUES-> ('cucumber', 100.25, 90, 2);mysql> SELECT * FROM SalesSummary;+--------------+-------------+----------------+------------------+| product_name | total_sales | avg_unit_price | total_units_sold |+--------------+-------------+----------------+------------------+| cucumber | 100.25 | 90.00 | 2 |+--------------+-------------+----------------+------------------+1 row in set (0.00 sec)mysql> DROP TABLE SalesSummary;mysql> SELECT * FROM SalesSummary;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 *
Create Table: CREATE TABLETable: tutorials_tbl
tutorials_tbl(tutorial_idint(11) NOT NULL auto_increment,tutorial_titlevarchar(100) NOT NULL default ‘’,tutorial_authorvarchar(40) NOT NULL default ‘’,submission_datedate default NULL, PRIMARY KEY (tutorial_id), UNIQUE KEYAUTHOR_INDEX(tutorial_author) ) TYPE=MyISAM 1 row in set (0.00 sec)
ERROR: No query specified
**步骤二:**<br />修改SQL语句的数据表名,并执行SQL语句。```phpmysql> CREATE TABLE `clone_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;Query OK, 0 rows affected (1.80 sec)
步骤三:
执行完第二步骤后,你将在数据库中创建新的克隆表 clone_tbl。 如果你想拷贝数据表的数据你可以使用**INSERT INTO... SELECT** 语句来实现。
mysql> INSERT INTO clone_tbl (tutorial_id,-> tutorial_title,-> tutorial_author,-> submission_date)-> SELECT tutorial_id,tutorial_title,-> tutorial_author,submission_date,-> FROM tutorials_tbl;Query OK, 3 rows affected (0.07 sec)Records: 3 Duplicates: 0 Warnings: 0
执行以上步骤后,你将完整的复制表,包括表结构及表数据。'Attr.nodeValue' is deprecated. Please use 'value' instead. adsbygoogle.js:32
