join left loke mysql_SQL语句语法

SQL语句语法

1. 环境登录

无需密码自动登录,系统用户名shiyanlou

2. 环境介绍

本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌面上的程序:

命令行终端: Linux命令行终端,打开后会进入Bash环境,可以使用Linux命令

Firefox及Opera:浏览器,可以用在需要前端界面的课程里,只需要打开环境里写的HTML/JS页面即可

gvim:非常好用的Vim编辑器,最简单的用法可以参考课程Vim编辑器

gedit及Brackets:如果您对gvim的使用不熟悉,可以用这两个作为代码编辑器,其中Brackets非常适用于前端代码开发

3. 环境使用

使用GVim编辑器输入实验所需的代码及文件,使用Xfce终端(XfceTerminal)运行所需命令进行操作。

实验报告可以在个人主页中查看,其中含有每次实验的截图及笔记,以及每次实验的有效学习时间(指的是在实验桌面内操作的时间,如果没有操作,系统会记录为发呆时间)。这些都是您学习的真实性证明。

一、数据定义语句

1.1 ALTER DATABASE语法

ALTER {DATABASE | SCHEMA} [db_name]

alter_specification [, alter_specification] ...

ALTER {DATABASE | SCHEMA} [db_name]

UPGRADE DATA DIRECTORY NAME

alter_specification:

[DEFAULT] CHARACTER SET charset_name

| [DEFAULT] COLLATE collation_name

上述语句第一行中ALTER DATABASE用于更改数据库的全局特性,这些特性储存在数据库目录中的db.opt文件中。要使用ALTER DATABASE,您需要获得数据库的ALTER权限。

第七行语句中CHARACTER SET子句用于更改默认的数据库字符集。

数据库名称可以忽略,如果没有指定数据库,语句对应操作的是默认数据库。ALTER SCHEMA语句等价于ALTER DATABASE。

举例:

当MySQL安装是从旧版本升级到MySQL5.1或更高版本,服务器显示的名称如a-b-c(这是在旧格式)将被更改为#mysql50#a-b-c,这就导致你每次查询数据库名称都需要添加前缀#mysql150#,在这种情况下使用语句UPGRADE DATA DIRECTORY NAME明确地告诉服务器数据库目录名称需要重新编码到当前的编码形式:

ALTER DATABASE `#mysql50#a-b-c` UPGRADE DATA DIRECTORY NAME;

执行以上语句后,你会发现可以直接在不添加前缀#mysql150#的情况下直接查询到数据库a-b-c。

1.2 ALTER TABLE语法

ALTER [IGNORE] TABLE tbl_name

alter_specification [, alter_specification] ...

alter_specification:

ADD [COLUMN] column_definition [FIRST | AFTER col_name ]

| ADD [COLUMN] (column_definition,...)

| ADD INDEX [index_name] [index_type] (index_col_name,...)

| ADD [CONSTRAINT [symbol]]

PRIMARY KEY [index_type] (index_col_name,...)

| ADD [CONSTRAINT [symbol]]

UNIQUE [index_name] [index_type] (index_col_name,...)

| ADD [FULLTEXT|SPATIAL] [index_name] (index_col_name,...)

| ADD [CONSTRAINT [symbol]]

FOREIGN KEY [index_name] (index_col_name,...)

[reference_definition]

| ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}

| CHANGE [COLUMN] old_col_name column_definition

[FIRST|AFTER col_name]

| MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]

| DROP [COLUMN] col_name

| DROP PRIMARY KEY

| DROP INDEX index_name

| DROP FOREIGN KEY fk_symbol

| DISABLE KEYS

| ENABLE KEYS

| RENAME [TO] new_tbl_name

| ORDER BY col_name

| CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]

| [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name]

| DISCARD TABLESPACE

| IMPORT TABLESPACE

| table_options

| partition_options

| ADD PARTITION partition_definition

| DROP PARTITION partition_names

| COALESCE PARTITION number

| REORGANIZE PARTITION partition_names INTO (partition_definitions)

| ANALYZE PARTITION partition_names

| CHECK PARTITION partition_names

| OPTIMIZE PARTITION partition_names

| REBUILD PARTITION partition_names

| REPAIR PARTITION partition_names

ALTER TABLE用于更改表的结构。例如,您可以增加或删减列,创建或取消索引,更改原有列的类型,或重新命名列或者表。您还可以更改表的评注和表的类型。

允许进行的变更中,许多子句的语法与CREATE TABLE中的子句的语法相近。其中包括table_options修改,选项有ENGINE,AUTO_INCREMENT和AVG_ROW_LENGTH等。

举例:

比如说,你需要将表格t1转换为InnoDB表,可以使用如下语句:

ALTER TABLE t1 ENGINE = InnoDB;

当你指定一个ENGINE子句,使用ALTER TABLE重建表,即使在该表t1中原本已经制定了存储引擎,以上操作仍然生效。

1.3 CREATE DATABASE语法

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name

[create_specification [, create_specification] ...]

create_specification:

[DEFAULT] CHARACTER SET charset_name

| [DEFAULT] COLLATE collation_name

CREATE DATABASE用于创建数据库,并进行命名。如果要使用CREATE DATABASE,您需要获得数据库CREATE权限。

1.4 CREATE INDEX语法

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name

[USING index_type]

ON tbl_name (index_col_name,...)

index_col_name:

col_name [(length)] [ASC | DESC]

CREATE INDEX被映射到一个ALTER TABLE语句上,用于创建索引。

FULLTEXT索引只能对CHAR,VARCHAR和TEXT类型数据编制索引,并且只能在MyISAM表中编制。SPATIAL索引只能对MyISAM表中的空间数据编制索引。

举例:

以下语句创建了customer表中name列的前十个字符的索引part_of_name:

CREATE INDEX part_of_name ON customer (name(10));

如果对列中的前10个字符进行索引,索引速度应该不会慢于整个name列的索引速度。此外,使用列的前缀建立索引可以使得索引文件更小,这样可以节省大量的磁盘空间,还可以加速INSERT操作。

1.5 CREATE TABLE语法

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name

[(create_definition,...)]

[table_options] [select_statement]

or:

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name

[(] LIKE old_tbl_name [)];

create_definition:

column_definition

| [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...)

| KEY [index_name] [index_type] (index_col_name,...)

| INDEX [index_name] [index_type] (index_col_name,...)

| [CONSTRAINT [symbol]] UNIQUE [INDEX]

[index_name] [index_type] (index_col_name,...)

| [FULLTEXT|SPATIAL] [INDEX] [index_name] (index_col_name,...)

| [CONSTRAINT [symbol]] FOREIGN KEY

[index_name] (index_col_name,...) [reference_definition]

| CHECK (expr)

column_definition:

col_name type [NOT NULL | NULL] [DEFAULT default_value]

[AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]

[COMMENT 'string'] [reference_definition]

type:

TINYINT[(length)] [UNSIGNED] [ZEROFILL]

| SMALLINT[(length)] [UNSIGNED] [ZEROFILL]

| MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]

| INT[(length)] [UNSIGNED] [ZEROFILL]

| INTEGER[(length)] [UNSIGNED] [ZEROFILL]

| BIGINT[(length)] [UNSIGNED] [ZEROFILL]

| REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]

| DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]

| FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]

| DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL]

| NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL]

| DATE

| TIME

| TIMESTAMP

| DATETIME

| CHAR(length) [BINARY | ASCII | UNICODE]

| VARCHAR(length) [BINARY]

| TINYBLOB

| BLOB

| MEDIUMBLOB

| LONGBLOB

| TINYTEXT [BINARY]

| TEXT [BINARY]

| MEDIUMTEXT [BINARY]

| LONGTEXT [BINARY]

| ENUM(value1,value2,value3,...)

| SET(value1,value2,value3,...)

| spatial_type

index_col_name:

col_name [(length)] [ASC | DESC]

reference_definition:

REFERENCES tbl_name [(index_col_name,...)]

[MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]

[ON DELETE reference_option]

[ON UPDATE reference_option]

reference_option:

RESTRICT | CASCADE | SET NULL | NO ACTION

table_options: table_option [table_option] ...

table_option:

{ENGINE|TYPE} = engine_name

| AUTO_INCREMENT = value

| AVG_ROW_LENGTH = value

| [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name]

| CHECKSUM = {0 | 1}

| COMMENT = 'string'

| CONNECTION = 'connect_string'

| MAX_ROWS = value

| MIN_ROWS = value

| PACK_KEYS = {0 | 1 | DEFAULT}

| PASSWORD = 'string'

| DELAY_KEY_WRITE = {0 | 1}

| ROW_FORMAT = {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}

| UNION = (tbl_name[,tbl_name]...)

| INSERT_METHOD = { NO | FIRST | LAST }

| DATA DIRECTORY = 'absolute path to directory'

| INDEX DIRECTORY = 'absolute path to directory'

partition_options:

PARTITION BY

[LINEAR] HASH(expr)

| [LINEAR] KEY(column_list)

| RANGE(expr)

| LIST(column_list)

[PARTITIONS num]

[ SUBPARTITION BY

[LINEAR] HASH(expr)

| [LINEAR] KEY(column_list)

[SUBPARTITIONS(num)]

]

[(partition_definition), [(partition_definition)], ...]

partition_definition:

PARTITION partition_name

[VALUES {

LESS THAN (expr) | MAXVALUE

| IN (value_list) }]

[[STORAGE] ENGINE [=] engine-name]

[COMMENT [=] 'comment_text' ]

[DATA DIRECTORY [=] 'data_dir']

[INDEX DIRECTORY [=] 'index_dir']

[MAX_ROWS [=] max_number_of_rows]

[MIN_ROWS [=] min_number_of_rows]

[TABLESPACE [=] (tablespace_name)]

[NODEGROUP [=] node_group_id]

[(subpartition_definition), [(subpartition_definition)], ...]

subpartition_definition:

SUBPARTITION logical_name

[[STORAGE] ENGINE [=] engine-name]

[COMMENT [=] 'comment_text' ]

[DATA DIRECTORY [=] 'data_dir']

[INDEX DIRECTORY [=] 'index_dir']

[MAX_ROWS [=] max_number_of_rows]

[MIN_ROWS [=] min_number_of_rows]

[TABLESPACE [=] (tablespace_name)]

[NODEGROUP [=] node_group_id]

select_statement:

[IGNORE | REPLACE] [AS] SELECT ... (Some legal select statement)

CREATE TABLE用于创建带给定名称的表。前提是您必须拥有表CREATE的权限。

举个复制表的例子:

在一个表orig_tb1已经被定义好的基础上使用语句CREATE TABLE ... LIKE去创建一个含有相应列属性和索引相同的另外一个空表new_tb1。

CREATE TABLE new_tbl LIKE orig_tbl;

那么,完全克隆一个表的内容以及结构就可以使用如下语句:

CREATE TABLE new_tbl SELECT * FROM orig_tbl;

1.6 DROP DATABASE语法

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

DROP DATABASE用于丢弃数据库中的所有表格并删除数据库。使用此语句时要非常小心!如果要使用DROP DATABASE,您需要获得数据库DROP权限。

IF EXISTS用于防止当数据库不存在时发生错误。

如果您对一个带有符号链接的数据库使用DROP DATABASE,则链接和原数据库都被丢弃。

DROP DATABASE会返回已被丢弃表的数目。此数目相当于被丢弃的.frm文件的数目。

1.7 DROP INDEX语法

DROP INDEX index_name ON tbl_name

DROP INDEX用于从表tbl_name中取消名称为index_name的索引。本语句如果被映射到一个ALTER TABLE语句中,就是用于取消索引。

举例:

要删除表t上的主键,刚好索引名就是PRIMARY,这时应该给索引名指定引号标识符,因为PRIMARY是一个保留字:

DROP INDEX `PRIMARY` ON t;

1.8 DROP TABLE语法

DROP [TEMPORARY] TABLE [IF EXISTS]

tbl_name [, tbl_name] ...

[RESTRICT | CASCADE]

DROP TABLE用于移除一个或多个表。您必须有每个表的DROP权限。所有的表数据和表定义会被移除,所以使用本语句要小心!

注意:对于一个带分区的表,DROP TABLE会永久性地移除表定义,移除各分区,并移除储存在这些分区中的所有数据。DROP TABLE还会移除与被移除表有关联的分区定义(.par)文件。

对于不存在的表,使用IF EXISTS用于防止错误发生。当使用IF EXISTS时,对于每个不存在的表,会生成一个NOTE。

1.9 RENAME TABLE语法

RENAME TABLE tbl_name TO new_tbl_name

[, tbl_name2 TO new_tbl_name2] ...

本语句用于对一个或多个表进行重命名。

注意:你不能直接使用RENAME给一个TEMPORARY类型的表重命名。但是你可以添加ALTER TABLE语句实现orig_name的重命名:

mysql> ALTER TABLE orig_name RENAME new_name;

二、数据操作语句

2.1 DELETE语法

单表语法:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name

[WHERE where_definition]

[ORDER BY ...]

[LIMIT row_count]

多表语法:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]

tbl_name[.*] [, tbl_name[.*] ...]

FROM table_references

[WHERE where_definition]

or:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]

FROM tbl_name[.*] [, tbl_name[.*] ...]

USING table_references

[WHERE where_definition]

如果tbl_name中有些行满足由where_definition给定的条件,那么DELETE就会删除这些行,并返回被删除的记录的数目。

如果您编写的DELETE语句中没有WHERE子句,则所有的行都被删除。当您不想知道被删除的行的数目时,有一个更快的方法,即使用TRUNCATE TABLE。

举例:

如果DELETE语句中含有ORDER BY子句,则按照子句中指定的顺序删除行,再结合LIMIT语句会显得非常有优势。

比如说,下面的语句就是找出表somelog中匹配WHERE子句条件的所有行,并根据timestamp_column这一列数据进行排序,然后删除第一(最老的)行:

mysql> DELETE FROM somelog WHERE user = 'jcole' ORDER BY timestamp_column LIMIT 1;

2.2 DO语法

DO expr [, expr] ...

DO用于执行表达式,但是不返回任何结果。DO是SELECT expr的简化表达方式。DO有一个优势,就是如果您不太关心结果的话,DO的速度稍快。 DO主要用于执行有副作用的函数,比如RELEASE_LOCK()。

举例:

这个SELECT有停止的作用,但是也产生了一个结果集:

mysql> SELECT SLEEP(5);

相反,尝试一下DO语句的神奇:

mysql> DO SLEEP(5);

以上例子适用于禁止产生结果集的存储函数或触发器。

2.3 HANDLER语法

HANDLER tbl_name OPEN [ AS alias ]

HANDLER tbl_name READ index_name { = | >= | <= | < } (value1,value2,...)

[ WHERE where_condition ] [LIMIT ... ]

HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }

[ WHERE where_condition ] [LIMIT ... ]

HANDLER tbl_name READ { FIRST | NEXT }

[ WHERE where_condition ] [LIMIT ... ]

HANDLER tbl_name CLOSE

HANDLER语句提供通往表存储引擎接口的直接通道。HANDLER可以用于MyISAM和InnoDB表。

HANDLER...OPEN语句用于打开一个表,通过后续的HANDLER...READ语句建立读取表的通道。本表目标不会被其它线程共享,也不会关闭,直到线程调用HANDLER...CLOSE或线程中止时为止。如果您使用一个别名打开表,如果要使用其它HANDLER语句进一步参阅表则必须使用此别名,而不能使用表名。

2.4 INSERT语法

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]

[INTO] tbl_name [(col_name,...)]

VALUES ({expr | DEFAULT},...),(...),...

[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

or:

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]

[INTO] tbl_name

SET col_name={expr | DEFAULT}, ...

[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

or:

INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]

[INTO] tbl_name [(col_name,...)]

SELECT ...

[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

INSERT用于向一个已有的表中插入新行。INSERT...VALUES和INSERT...SET形式的语句根据明确指定的值插入行。INSERT...SELECT形式的语句插入从其它表中选出的行。

举例:

INSERT语句可以使用VALUES语法插入多行数据。要想实现这一点,每一列的值列表必须用括号括起来,并使用逗号隔开。例如:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

2.5 LOAD DATA INFILE语法

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt'

[REPLACE | IGNORE]

INTO TABLE tbl_name

[FIELDS

[TERMINATED BY 'string']

[[OPTIONALLY] ENCLOSED BY 'char']

[ESCAPED BY 'char' ]

]

[LINES

[STARTING BY 'string']

[TERMINATED BY 'string']

]

[IGNORE number LINES]

[(col_name_or_user_var,...)]

[SET col_name = expr,...)]

LOAD DATA INFILE语句用于高速地从一个文本文件中读取行,并装入一个表中。文件名称必须为文字字符串类型。

举例:

下面例子是从文件persondata.txt中加载数据到表persondata中:

LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata;

2.6 REPLACE语法

REPLACE [LOW_PRIORITY | DELAYED]

[INTO] tbl_name [(col_name,...)]

VALUES ({expr | DEFAULT},...),(...),...

或:

REPLACE [LOW_PRIORITY | DELAYED]

[INTO] tbl_name

SET col_name={expr | DEFAULT}, ...

或:

REPLACE [LOW_PRIORITY | DELAYED]

[INTO] tbl_name [(col_name,...)]

SELECT ...

REPLACE的运行模式与INSERT很相像。只有一点除外,如果表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除。

2.7 SELECT语法

SELECT

[ALL | DISTINCT | DISTINCTROW ]

[HIGH_PRIORITY]

[STRAIGHT_JOIN]

[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]

[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]

select_expr, ...

[INTO OUTFILE 'file_name' export_options

| INTO DUMPFILE 'file_name']

[FROM table_references

[WHERE where_definition]

[GROUP BY {col_name | expr | position}

[ASC | DESC], ... [WITH ROLLUP]]

[HAVING where_definition]

[ORDER BY {col_name | expr | position}

[ASC | DESC] , ...]

[LIMIT {[offset,] row_count | row_count OFFSET offset}]

[PROCEDURE procedure_name(argument_list)]

[FOR UPDATE | LOCK IN SHARE MODE]]

SELECT用于从一个或多个表中恢复选择的行,也可以用于在不检索任何表的情况下计算。

例如:

mysql> SELECT 1 + 1;

也可以在没有表可以参考的情况下指定DUAL为一个虚拟的表名:

mysql> SELECT 1 + 1 FROM DUAL;

2.7.1 JOIN语法

MySQL支持以下JOIN语法。这些语法用于SELECT语句的table_references部分和多表DELETE和UPDATE语句:

table_references:

table_reference [, table_reference] …

table_reference:

table_factor

| join_table

table_factor:

tbl_name [[AS] alias]

[{USE|IGNORE|FORCE} INDEX (key_list)]

| ( table_references )

| { OJ table_reference LEFT OUTER JOIN table_reference

ON conditional_expr }

join_table:

table_reference [INNER | CROSS] JOIN table_factor [join_condition]

| table_reference STRAIGHT_JOIN table_factor

| table_reference STRAIGHT_JOIN table_factor ON condition

| table_reference LEFT [OUTER] JOIN table_reference join_condition

| table_reference NATURAL [LEFT [OUTER]] JOIN table_factor

| table_reference RIGHT [OUTER] JOIN table_reference join_condition

| table_reference NATURAL [RIGHT [OUTER]] JOIN table_factor

join_condition:

ON conditional_expr

| USING (column_list)

一个表的引用也被称为一个联合表达式。与SQL标准相比,table_factor的语法被扩展了,前者只接受table_reference,不接受括号内的table_reference列表。

2.7.2 UNION语法

SELECT ...

UNION [ALL | DISTINCT]

SELECT ...

[UNION [ALL | DISTINCT]

SELECT ...]

UNION用于把来自多个SELECT语句的结果组合到一个结果集中。

举例:

如果相应的SELECT列的数据类型不匹配,那么在UNION中列的类型和长度应该考虑所有的SELECT语句的返回值。比如:

mysql> SELECT REPEAT('a',1) UNION SELECT REPEAT('b',10);

你会发现:只有最后一个SELECT语句被重复写入输出集;

思考一下,为什么?并把答案写入到实验报告。

2.8 UPDATE语法

单表语法:

UPDATE [LOW_PRIORITY] [IGNORE] tbl_name

SET col_name1=expr1 [, col_name2=expr2 ...]

[WHERE where_definition]

[ORDER BY ...]

[LIMIT row_count]

多表语法:

UPDATE [LOW_PRIORITY] [IGNORE] table_references

SET col_name1=expr1 [, col_name2=expr2 ...]

[WHERE where_definition]

UPDATE语法可以将新值更新到原有表中的行和列。SET子句指示要修改哪些列和要给予哪些值。WHERE子句指定应更新哪些行。如果没有WHERE子句,则更新所有的行。如果指定了ORDER BY子句,则按照被指定的顺序对行进行更新。LIMIT子句用于给定一个限值,限制可以被更新的行的数目。

例子:

例如,表t中的id列有1和2这两个值,并且在2被更新到3之前,1会被更新为2,那么就会出错。为了避免这个问题,添加一个ORDER BY子句让拥有较大id值的行更早更新:

UPDATE t SET id = id + 1 ORDER BY id DESC;

三、MySQL实用工具语法

3.1 DESCRIBE语法(获取有关列的信息)

{DESCRIBE | DESC} tbl_name [col_name | wild]

DESCRIBE可以提供有关表中各列的信息。它是SHOW COLUMNS FROM的快捷方式。

3.2 USE语法

USE db_name

USE db_name语句可以通告MySQL把db_name数据库作为默认(当前)数据库使用,用于后续的语句。

四、MySQL事务处理和锁定语句

4.1 START TRANSACTION,COMMIT和ROLLBACK语法

START TRANSACTION | BEGIN [WORK]

COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]

ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]

SET AUTOCOMMIT = {0 | 1}

以下语句提供事务的使用控制:

START TRANSACTION或BEGIN语句可以开始一项新的事务。

COMMIT可以提交当前事务,使其永久更改。

ROLLBACK可以回滚当前事务,取消变更。

SET AUTOCOMMIT语句可以禁用或启用当前连接中默认的autocommit模式,。

默认情况下,MySQL采用autocommit模式运行。这意味着,当您执行一个用于更新(修改)表的语句之后,MySQL立刻把更新存储到磁盘中。

如果您正在使用一个事务安全型的存储引擎(如InnoDB,BDB或NDB簇),则您可以使用以下语句禁用autocommit模式:

SET AUTOCOMMIT=0;

通过把AUTOCOMMIT变量设置为零,禁用autocommit模式之后,您必须使用COMMIT把变更存储到磁盘中,或者如果您想要忽略从事务开始进行以来做出的变更,请使用ROLLBACK。

如果您想要对于一个单一系列的语句禁用autocommit模式,则您可以使用START TRANSACTION语句:

START TRANSACTION;

SELECT @A:=SUM(salary) FROM table1 WHERE type=1;

UPDATE table2 SET summary=@A WHERE type=1;

COMMIT;

使用START TRANSACTION,autocommit仍然被禁用,直到您使用COMMIT或ROLLBACK结束事务为止。然后autocommit模式恢复到原来的状态。

BEGIN和BEGIN WORK被作为START TRANSACTION的别名受到支持,用于对事务进行初始化。START TRANSACTION是标准的SQL语法,并且是启动一个ad-hoc事务的推荐方法。BEGIN语句与BEGIN关键词的使用不同。BEGIN关键词可以启动一个BEGIN...END复合语句。后者不会开始一项事务。

您也可以按照如下方法开始一项事务:

START TRANSACTION WITH CONSISTENT SNAPSHOT;

WITH CONSISTENT SNAPSHOT子句用于启动一个一致的读取,用于具有此类功能的存储引擎。目前,该子句只适用于InnoDB,该子句的效果与发布一个START TRANSACTION,后面跟一个来自任何InnoDB表的SELECT的效果一样。

开始一项事务会造成一个隐含的UNLOCK TABLES被执行。

为了获得最好的结果,事务应只使用由单一事务存储引擎管理的表执行。否则,会出现以下问题:

如果您使用的表来自多个事务安全型存储引擎(例如InnoDB),并且事务隔离等级不是SERIALIZABLE,则有可能当一个事务提交时,其它正在进行中的、使用同样的表的事务将只会发生由第一个事务产生的变更。也就是,用混合引擎不能保证事务的原子性,并会造成不一致。(如果混合引擎事务不经常有,则您可以根据需要使用SET TRANSACTION ISOLATION LEVEL把隔离等级设置到SERIALIZABLE。)

如果您在事务中使用非事务安全型表,则对这些表的任何变更被立刻存储,不论autocommit模式的状态如何。

如果您在更新了事务中一个事务表之后,发布一个ROLLBACK语句,则会出现一个ER_WARNING_NOT_COMPLETE_ROLLBACK警告。对事务安全型表的变更会被回滚,但是非事务安全型表没有发生任何改变。

每个事务被存储在一个组块中的二进制日志中,在COMMIT之上。其中被回滚的事务不被计入日志。(例外情况:对非事务表的更改不会被回滚。如果一个被回滚的事务包括对非事务表的更改,则整个事务使用一个ROLLBACK语句计入日志末端,以确保对这些表的更改进行复制。)

您可以使用SET TRANSACTION ISOLATION LEVEL更改事务的隔离等级。

4.2 SAVEPOINT和ROLLBACK TO SAVEPOINT语法

SAVEPOINT identifier

ROLLBACK [WORK] TO SAVEPOINT identifier

RELEASE SAVEPOINT identifier

InnoDB支持SQL语句SAVEPOINT, ROLLBACK TO SAVEPOINT, RELEASE SAVEPOINT和可选的用于ROLLBACK的WORK关键词。

SAVEPOINT语句用于用标识符名称设置命名一个事务保存点。如果当前事务有一个同样名称的保存点,则旧的保存点被删除,新的保存点就会被设置。

ROLLBACK TO SAVEPOINT语句会向以命名的保存点回滚一个事务。如果在保存点被设置后,当前事务对行进行了更改,则这些更改会在回滚中被撤销。但是,InnoDB不会释放被存储在保存点之后的存储器中的行锁定。(注意,对于新插入的行,锁定信息被存储在行中的事务ID承载;锁定没有被分开存储在存储器中。在这种情况下,行锁定在撤销中被释放。)在被命名的保存点之后设置的保存点被删除。

如果语句返回以下错误,则意味着不存在带有指定名称的保存点:

ERROR 1181: Got error 153 during ROLLBACK

RELEASE SAVEPOINT语句会从当前事务的一组保存点中删除已命名的保存点,不出现提交或回滚。如果保存点不存在,会出现错误。

如果您执行COMMIT或执行不能命名保存点的ROLLBACK,则当前事务的所有保存点被删除。

4.3 LOCK TABLES和UNLOCK TABLES语法

LOCK TABLES

tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}

[, tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}] ...

LOCK TABLES可以锁定用于当前线程的表。如果表被其它线程锁定,则造成堵塞,直到可以获取所有锁定为止。UNLOCK TABLES可以释放被当前线程保持的任何锁定。当线程发布另一个LOCK TABLES时,或当与服务器的连接被关闭时,所有由当前线程锁定的表被隐含地解锁。

表锁定只用于防止其它客户端进行不正当地读取和写入。保持锁定(即使是读取锁定)的客户端可以进行表层级的操作,比如DROP TABLE。

4.4 SET TRANSACTION语法

SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL

{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }

本语句用于设置事务隔离等级,用于下一个事务或者当前会话。

在默认情况下,SET TRANSACTION会为下一个(还未开始)事务设置隔离等级。如果您使用GLOBAL关键词,则语句会设置全局性的默认事务等级,用于从该点以后创建的所有新连接,且原有的连接不受影响。要进行此操作,您需要SUPER权限。使用SESSION关键词可以设置默认事务等级,用于对当前连接执行所有将来事务。

4.5 XA事务SQL语法

要在MySQL中执行XA事务,应使用以下语句:

XA {START|BEGIN} xid [JOIN|RESUME]

XA END xid [SUSPEND [FOR MIGRATE]]

XA PREPARE xid

XA COMMIT xid [ONE PHASE]

XA ROLLBACK xid

XA RECOVER

对于XA START,JOIN和RESUME子句不被支持。

对于XA END,SUSPEND [FOR MIGRATE]子句不被支持。

每个XA语句以XA关键词为开头,多数语句要求一个xid值。xid是XA事务的标识符,它指示该语句适用于哪个事务。xid值由客户端提供,或由MySQL服务器生成。xid值包含一到三个部分:

xid: gtrid [, bqual [, formatID ]]

gtrid是一个全局事务标识符,bqual是一个分支限定符,formatID是一个用于标识由gtrid和bqual值使用的格式的数字。根据语法,bqual和formatID是可选的。如果没有给定,默认的bqual值是'',默认的fromatID值是1。

gtrid和bqual必须为字符串文字,每个的长度最多为64字节(不是字符)。gtrid和bqual可以用多种方法指定。您可以使用带引号的字符串('ab'),十六进制字符串(0x6162, X'ab'),或位值(b'nnnn')。

formatID是一个无符号的整数。

五、数据库管理语句

5.1 账户管理语句

5.1.1 CREATE USER语法

CREATE USER user [IDENTIFIED BY [PASSWORD] 'password']

[, user [IDENTIFIED BY [PASSWORD] 'password']] ...

CREATE USER用于创建新的MySQL账户。要使用CREATE USER,您必须拥有mysql数据库的全局CREATE USER权限,或拥有INSERT权限。对于每个账户,CREATE USER会在mysql.user表中创建一个新记录。如果试图建立一个已经存在的账户,则会报错。

使用可选的IDENTIFIED BY子句,可以为账户给定一个密码。举例如下:

创建一个已经使用sha256_password认证的插件和密码设置为'new-password'的账户'jeffrey'@'localhost',要求每隔180天建立一个新的密码:

CREATE USER 'jeffrey'@'localhost'

IDENTIFIED WITH sha256_password BY 'new-password'

PASSWORD EXPIRE INTERVAL 180 DAY;

5.1.2 DROP USER语法

DROP USER user [, user] ...

DROP USER语句用于删除一个或多个MySQL账户。要使用DROP USER,您必须拥有mysql数据库的全局CREATE USER权限或DELETE权限。

5.1.3 GRANT和REVOKE语法

GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...

ON [object_type] {tbl_name | * | *.* | db_name.*}

TO user [IDENTIFIED BY [PASSWORD] 'password']

[, user [IDENTIFIED BY [PASSWORD] 'password']] ...

[REQUIRE

NONE |

[{SSL| X509}]

[CIPHER 'cipher' [AND]]

[ISSUER 'issuer' [AND]]

[SUBJECT 'subject']]

[WITH with_option [with_option] ...]

object_type =

TABLE

| FUNCTION

| PROCEDURE

with_option =

GRANT OPTION

| MAX_QUERIES_PER_HOUR count

| MAX_UPDATES_PER_HOUR count

| MAX_CONNECTIONS_PER_HOUR count

| MAX_USER_CONNECTIONS count

REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...

ON [object_type] {tbl_name | * | *.* | db_name.*}

FROM user [, user] ...

REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...

GRANT和REVOKE语句允许系统管理员创建MySQL用户账户,授予权限和撤销权限。

5.1.4 RENAME USER语法

RENAME USER old_user TO new_user

[, old_user TO new_user] ...

RENAME USER语句用于对原有MySQL账户进行重命名。要使用RENAME USER,您必须拥有全局CREATE USER权限或mysql数据库UPDATE权限。如果旧 账户不存在或者新账户已存在,则会出现错误。old_user和new_user值的给定方法与GRANT语句一样。

例如:

RENAME USER 'jeffrey'@'localhost' TO 'jeff'@'127.0.0.1';

5.1.5 SET PASSWORD语法

SET PASSWORD = PASSWORD('some password')

SET PASSWORD FOR user = PASSWORD('some password')

SET PASSWORD语句用于向一个原有MySQL用户账户赋予密码。

第一个语法是为当前用户设置密码,其中使用一个非匿名账户连接到服务器上的任何客户即都可以更改该账户的密码。

第二个语法是为当前服务器主机上的一个特定账户设置密码。只有拥有mysql数据库UPDATE权限的客户端可以这么做。user值应以为固定格式user_name@host_name,此处user_name和host_name与mysql.user表登录项的User和Host列中列出的完全一样。

5.2 表维护语句

5.2.1 ANALYZE TABLE语法

ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

本语句用于分析和存储表的关键字分布。在分析期间,使用读取锁定对表MyISAM, BDB和InnoDB表进行锁定。对于MyISAM表,本语句与使用myisamchk --analyze相当。

当您对除常数以外的对象执行联合时,MySQL使用已存储的关键字分布来决定,表按什么顺序进行联合。

ANALYZE TABLE语句会返回一个含有下列的结果集:

5.2.3 CHECK TABLE语法

CHECK TABLE tbl_name [, tbl_name] ... [option] ...

option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}

CHECK TABLE对MyISAM和InnoDB表执行检查。对于MyISAM表,关键字统计数据在检查的同时也被更新。

CHECK TABLE也可以检查视图是否有错误,比如在视图定义中被引用的表已不存在。

CHECK TABLE语句会返回一个含有以下列的结果集:

5.2.4 CHECKSUM TABLE语法

CHECKSUM TABLE tbl_name [, tbl_name] ... [ QUICK | EXTENDED ]

报告表的校验和。

5.2.5 OPTIMIZE TABLE语法

OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

如果您已经删除了表的一大部分,或者如果您已经对含有可变长度行的表(含有VARCHAR,BLOB或TEXT列的表)进行了很多更改,则应使用OPTIMIZE TABLE。被删除的记录被保存在链接清单中,后续的INSERT操作会重新使用旧的记录位置。您可以使用OPTIMIZE TABLE来重新利用未使用的空间,并整理数据文件碎片。

在多数的设置中,您根本不需要运行OPTIMIZE TABLE。即使您对可变长度的行进行了大量的更新,您也不需要经常运行,只对特定的表每周一次或每月一次执行该语句即可。

5.2.6 REPAIR TABLE语法

REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE

tbl_name [, tbl_name] ... [QUICK] [EXTENDED] [USE_FRM]

REPAIR TABLE用于修复被破坏的表。默认情况下,REPAIR TABLE与myisamchk --recover tbl_name具有相同的效果。REPAIR TABLE对MyISAM和ARCHIVE表起作用。

通常,您基本上不必运行此语句。但是,如果'灾难'真的发生,REPAIR TABLE很有可能从MyISAM表中找回所有数据。如果您的表经常被破坏,您应该尽力找到原因,以避免使用REPAIR TALBE。

本语句会返回一个含有以下列的结果集:

5.3 SET语法

SET variable_assignment [, variable_assignment] ...

variable_assignment:

user_var_name = expr

| [GLOBAL | SESSION] system_var_name = expr

| @@[global. | session.]system_var_name = expr

SET用于设置不同类型的变量,这些变量会影响服务器或客户端的操作。SET可以用于向用户变量或系统变量赋值。

5.4 SHOW语法

5.4.1 SHOW CHARACTER SET语法

SHOW CHARACTER SET [LIKE 'pattern']

SHOW CHARACTER SET语句用于显示所有可用的字符集。如果选定LIKE子句,该子句用于指定哪些字符集名称可以匹配。

5.4.2 SHOW COLLATION语法

SHOW COLLATION [LIKE 'pattern']

默认情况下,SHOW COLLATION语句输出所有可用的字符集。该语句如果设置可选LIKE子句,那么pattern将指定哪些归类名可以匹配。

5.4.3 SHOW COLUMNS语法

SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [LIKE 'pattern']

SHOW COLUMNS显示在一个给定表中的各列的信息。对于视图,本语句也起作用。

5.4.4 SHOW CREATE DATABASE语法

SHOW CREATE {DATABASE | SCHEMA} db_name

显示CREATE DATABASE语句创建的给定数据库。也可以使用SHOW CREATE SCHEMA。

5.4.5 SHOW CREATE TABLE语法

SHOW CREATE TABLE tbl_name

显示CREATE TABLE语句创建的给定表格。本语句对视图也起作用。

5.4.6 SHOW DATABASES语法

SHOW {DATABASES | SCHEMAS} [LIKE 'pattern']

SHOW DATABASES可以列举在MySQL服务器主机上的所有数据库。您也可以使用mysqlshow命令得到此数据库清单。您只能看到您拥有的权限可以允许看到的的数据库,除非您拥有全局SHOW DATABASES权限。

如果服务器以--skip-show-database选项方式启动,那么您根本不能使用本语句,除非您拥有SHOW DATABASES权限。

5.4.7 SHOW ENGINE语法

SHOW ENGINE engine_name {LOGS | STATUS }

SHOW ENGINE显示存储引擎的日志或状态信息。

5.4.8 SHOW ENGINES语法

SHOW [STORAGE] ENGINES

SHOW ENGINES显示存储引擎的状态信息。对于检查一个存储引擎是否被支持,或者对于查看默认引擎是什么,本语句十分有用。

5.4.9 SHOW ERRORS语法

SHOW ERRORS [LIMIT [offset,] row_count]

SHOW COUNT(*) ERRORS

本语句与SHOW WARNINGS接近,不过该语句只显示错误,并不同时显示错误、警告和注意信息。

5.4.10 SHOW GRANTS语法

SHOW GRANTS FOR user

本语句列出了在为MySQL用户账户复制权限时必须发布的GRANT语句。

5.4.11 SHOW INDEX语法

SHOW INDEX FROM tbl_name [FROM db_name]

SHOW INDEX会返回表索引信息。其格式与ODBC中的SQLStatistics调用相似。

5.4.12 SHOW INNODB STATUS语法

SHOW INNODB STATUS

在MySQL 5.1中,等价于SHOW ENGINE INNODB STATUS,但不赞成使用后者。

5.4.13 SHOW LOGS语法

SHOW [BDB] LOGS

5.4.14 SHOW OPEN TABLES语法

SHOW OPEN TABLES [FROM db_name] [LIKE 'pattern']

SHOW OPEN TABLES列举当前在表缓存中被打开的非TEMPORARY表。

5.4.15 SHOW PRIVILEGES语法

SHOW PRIVILEGES

SHOW PRIVILEGES显示MySQL服务器支持的系统权限列表。确切的输出内容需要根据您的服务器的版本而定。

5.4.16 SHOW PROCESSLIST语法

SHOW [FULL] PROCESSLIST

SHOW PROCESSLIST显示正在运行的线程。您也可以使用mysqladmin processlist语句得到此信息。如果您有SUPER权限,您可以看到所有线程,否则,您只能看到您自己的线程(也就是,与您正在使用的MySQL账户相关的线程)。

5.4.17 SHOW STATUS语法

SHOW [GLOBAL | SESSION] STATUS [LIKE 'pattern']

SHOW STATUS提供服务器状态信息。此信息也可以使用mysqladmin extended-status命令获得。

5.4.18 SHOW TABLE STATUS语法

SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern']

SHOW TABLE STATUS的性质与SHOW TABLE的类似;不过,可以提供每个表的大量信息。您也可以使用mysqlshow --status db_name命令得到此信息列表。本语句也显示视图信息。

5.4.19 SHOW TABLES语法

SHOW [FULL] TABLES [FROM db_name] [LIKE 'pattern']

SHOW TABLES列举了给定数据库中的非TEMPORARY表。您也可以使用mysqlshow db_name命令得到此列表。

本命令也列举数据库中的视图。支持FULL修改符,这样SHOW FULL TABLES就可以显示到第二个输出列。对于一个表,第二列的值为BASE TABLE;对于一个视图,第二列的值为VIEW。

注释:如果您对一个表没有权限,则该表不会在来自SHOW TABLES或mysqlshow db_name命令的输出中显示。

5.4.20 SHOW TRIGGERS语法

SHOW TRIGGERS [FROM db_name] [LIKE expr]

SHOW TRIGGERS列出了目前被MySQL服务器定义的触发程序。

5.5 其他管理语句

5.5.1 CACHE INDEX语法

CACHE INDEX

tbl_index_list [, tbl_index_list] ...

IN key_cache_name

tbl_index_list:

tbl_name [[INDEX|KEY] (index_name[, index_name] ...)]

CACHE INDEX语句把表索引分配给某个关键缓存。该语句只用于MyISAM表。

5.5.2 FLUSH语法

FLUSH [LOCAL | NO_WRITE_TO_BINLOG] flush_option [, flush_option] ...

如果您想要清除MySQL使用部分的内部缓存,您应该使用FLUSH语句。要执行FLUSH,您必须拥有RELOAD权限。

5.5.3 KILL语法

KILL [CONNECTION | QUERY] thread_id

每个与mysqld的连接都在一个独立的线程里运行,您可以使用SHOW PROCESSLIST语句查看哪些线程正在运行,并使用KILL thread_id语句终止其中一个线程。

KILL允许可选参数CONNECTION或QUERY修改符:

KILL CONNECTION与不含修改符的KILL一样:它会终止与给定的thread_id有关的连接。

KILL QUERY会终止当前与正在执行的语句的连接,但是会保持连接的原状。

如果您拥有PROCESS权限,则您可以查看所有线程。如果您拥有SUPER权限,您可以终止所有线程和语句。否则,您只能查看和终止您自己的线程和语句。

您也可以使用mysqladmin processlist和mysqladmin kill命令来检查和终止线程。

5.5.4 LOAD INDEX INTO CACHE语法

LOAD INDEX INTO CACHE

tbl_index_list [, tbl_index_list] ...

tbl_index_list:

tbl_name

[[INDEX|KEY] (index_name[, index_name] ...)]

[IGNORE LEAVES]

LOAD INDEX INTO CACHE语句会把一个表索引预载入到某个关键缓存中。

5.5.5 RESET语法

RESET reset_option [, reset_option] ...

RESET语句被用于清除不同的服务器操作的状态。它也作为FLUSH语句的更强大的版本。

为了执行RESET,您必须拥有RELOAD权限。

reset_option可以为以下的任何一项:

MASTER可以删除列于索引文件中的所有二进制日志,把二进制日志索引文件重新设置为空,并创建一个新的二进制日志文件。(在以前版本的MySQL中,被称为FLUSH MASTER。)

QUERY CACHE 从查询缓存中取消所有的查询结果。

SLAVE可以使从属服务器忘记其在主服务器二进制日志中的复制位置,另外,也可以通过删除原有的中继日志文件和开始一个新文件来重新设置中继日志。

六、复制语句

6.1 用于控制主服务器的SQL语句

6.1.1 PURGE MASTER LOGS语法

PURGE {MASTER | BINARY} LOGS TO 'log_name'

PURGE {MASTER | BINARY} LOGS BEFORE 'date'

首先介绍什么是二进制日志。二进制日志是一组记录MySQL服务器进行数据修改时的信息文件;该日志由一组二进制文件和索引文件组成。

那么PURGE MASTER LOGS语法就是用于删除列于在指定的日志或日期之前的日志索引中的所有二进制日志。这些被删除的日志文件也会被移出索引文件的记录列表,以致指定的日志文件被排在日志列表首部。

6.1.2 RESET MASTER语法

RESET MASTER

可以删除列于索引文件中的所有二进制日志,把二进制日志索引文件重新设置为空,并创建一个新的二进制日志文件。

6.1.3 SET SQL_LOG_BIN语法

SET SQL_LOG_BIN = {0|1}

如果客户端使用一个有SUPER权限的账户连接,则可以禁用或启用当前连接的二进制日志记录。如果客户端没有此权限,则语句被拒绝,并伴随错误提示。

6.1.4 SHOW BINLOG EVENTS语法

SHOW BINLOG EVENTS

[IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]

用于显示二进制日志中的事件。如果您不指定'log_name',则显示第一个二进制日志。

6.1.5 SHOW MASTER LOGS语法

SHOW MASTER LOGS

SHOW BINARY LOGS

用于列出服务器中的二进制日志文件。

6.1.6 SHOW MASTER STATUS语法

SHOW MASTER STATUS

用于提供主服务器上二进制日志文件的状态信息。需要有SUPER或者REPLICATION CLIENT权限才能执行该语句。

6.1.7 SHOW SLAVE HOSTS语法

SHOW SLAVE HOSTS

用于显示当前使用主服务器注册的克隆从属服务器的清单。不以--report-host=slave_name选项为开头的从属服务器不会显示在本清单中。

6.2 用于控制从服务器的SQL语句

6.2.1 CHANGE MASTER TO语法

CHANGE MASTER TO master_def [, master_def] ...

master_def:

MASTER_HOST = 'host_name'

| MASTER_USER = 'user_name'

| MASTER_PASSWORD = 'password'

| MASTER_PORT = port_num

| MASTER_CONNECT_RETRY = count

| MASTER_LOG_FILE = 'master_log_name'

| MASTER_LOG_POS = master_log_pos

| RELAY_LOG_FILE = 'relay_log_name'

| RELAY_LOG_POS = relay_log_pos

| MASTER_SSL = {0|1}

| MASTER_SSL_CA = 'ca_file_name'

| MASTER_SSL_CAPATH = 'ca_directory_name'

| MASTER_SSL_CERT = 'cert_file_name'

| MASTER_SSL_KEY = 'key_file_name'

| MASTER_SSL_CIPHER = 'cipher_list'

可以更改从属服务器用于与主服务器进行连接和通讯的参数。

MASTER_USER, MASTER_PASSWORD,MASTER_SSL,MASTER_SSL_CA,MASTER_SSL_CAPATH, MASTER_SSL_CERT,MASTER_SSL_KEY和MASTER_SSL_CIPHER这些参数用于向从属服务器提供有关如何与主服务器连接的信息。

即使对于在编译时没有SSL支持的从属服务器,SSL选项(MASTER_SSL, MASTER_SSL_CA, MASTER_SSL_CAPATH, MASTER_SSL_CERT, MASTER_SSL_KEY和MASTER_SSL_CIPHER)也可以被更改。它们被保存到master.info文件中,但是会被忽略,直到您使用SSL支持已启用的服务器。

6.2.2 MASTER_POS_WAIT()语法

SELECT MASTER_POS_WAIT('master_log_file', master_log_pos)

该语法实际上是一个函数,而不是一个语句。它被用于确认从属服务器已读取并执行最后到达主服务器上二进制日志的给定位置。

6.2.3 RESET SLAVE语法

RESET SLAVE

用于让从属服务器忘记其在主服务器的二进制日志中的复制位置。本语句被用于进行一个明确的启动:它会删除master.info和relay-log.info文件,以及所有的中继日志,并启动一个新的中继日志。

注释:所有的中继日志被删除,即使它们没有被从属服务器SQL线程完全的执行。(如果您已经发布了一个STOP SLAVE语句或如果从属服务器的载入量很大,那么以上情况将会发生在从属服务器上。)

存储在master.info文件中的连接信息通过使用在对应的启动选项中指定的值,被立即重新设置了。此信息包括主服务器主机、主服务器接口、主服务器用户和主服务器密码等值。当从属服务器SQL线程被中止时,它位于正在复制的临时表的中,当发布RESET SLAVE语句时,已被复制的临时表在从属服务器中被删除。

6.2.4 SET GLOBAL SQL_SLAVE_SKIP_COUNTER语法

SET GLOBAL SQL_SLAVE_SKIP_COUNTER = n

该语句作用是跳过来自主服务器上的n个事件,一般有效作用于当复制被某个语句终止的时候还原。

仅当从属线程没有正在运行时,本语句是有效的,否则会产生错误。

6.2.5 START SLAVE语法

START SLAVE [thread_type [, thread_type] ... ]

START SLAVE [SQL_THREAD] UNTIL

MASTER_LOG_FILE = 'log_name', MASTER_LOG_POS = log_pos

START SLAVE [SQL_THREAD] UNTIL

RELAY_LOG_FILE = 'log_name', RELAY_LOG_POS = log_pos

thread_type: IO_THREAD | SQL_THREAD

不含任何可选参数的START SLAVE会同时启动两个从属服务器线程。I/O线程从主服务器中读取查询事件,并把它们存储在中继日志中,SQL线程读取中继日志并执行查询。START SLAVE语句要求SUPER权限。

6.2.6 STOP SLAVE语法

STOP SLAVE [thread_type [, thread_type] ... ]

thread_type: IO_THREAD | SQL_THREAD

用于中止从属服务器线程。STOP SLAVE的执行要求具有SUPER权限。

和START SLAVE相似,本语句在使用时可以添加IO_THREAD和SQL_THREAD选项,指明将被中止的线程。

在以前版本的MySQL中,本语句被称为SLAVE STOP,在MySQL 5.1中仍然接受这种用法,以便与以前版本兼容,但是现在不赞成使用该语句。

七、用于预处理语句的SQL语法

预处理语句的SQL语法基于以下三个SQL语句:

PREPARE stmt_name FROM preparable_stmt;

EXECUTE stmt_name [USING @var_name [, @var_name] ...];

{DEALLOCATE | DROP} PREPARE stmt_name;

PREPARE语句用于准备一个语句,并赋予它一个名称stmt_name,借此在以后引用该语句。

语句名称不区分大小写。preparable_stmt可以是一个文字字符串,也可以是一个包含了语句文本的用户变量。如果是文本,那么必须展现一个单一的SQL语句,而不是多个语句。使用本语句,?字符可以被用于标记参数,以指示当您执行查询时,数据值在哪里与查询结合在一起。?字符不应加引号,即使您想要把它们与字符串值结合在一起,也不要加引号。参数标记符只能被用于数据值应该出现的地方,不用于SQL关键词和标识符等。

如果带有此名称的预备语句已经存在,则在新的语言被预备以前,它会被隐含地解除分配。这意味着,如果新语句包含一个错误并且不能被预备,则会返回一个错误,并且不存在带有给定名称语句。

预备语句用于客户端内部会话:

在此会话内,如果语句被创建,那么其它客户端看不到它。

在预备了一个语句后,您可使用一个EXECUTE语句(该语句引用了预制语句名称)来执行它。如果预制语句包含任何参数标记符,则您必须提供一个列举了用户变量(其中包含要与参数结合的值)的USING子句。参数值只能由用户变量提供,USING子句必须准确地指明用户变量。用户变量的数目与语句中的参数标记符的数量一样多。

您可以多次执行一个给定的预制语句,在每次执行前,把不同的变量传递给它,或把变量设置为不同的值。

要对一个预制语句解除分配,需使用DEALLOCATE PREPARE语句。尝试在解除分配后执行一个预制语句会导致错误。

如果您终止了一个客户端会话,同时没有对以前已预制的语句解除分配,则服务器会自动解除分配。

以下SQL语句可以被用在预制语句中:CREATE TABLE, DELETE, DO, INSERT, REPLACE, SELECT, SET, UPDATE和多数的SHOW语句。目前不支持其它语句。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值