语法说明
<>
内部为自定义内容:自主命名,例如:数据库名称、表名称、字段名、索引名、表注释、字段注释等
从特定备选列表中自主选择,例如:字符集、排序规则、数据类型、约束条件、表选项等
[]
内部为可选项,可能嵌套
数据库
创建数据库
语法:
CREATE DATABASE IF NOT EXISTS <数据库名称> [[DEFAULT] {CHARACTER SET | CHARSET} <字符集>] [[DEFAULT] COLLATE <排序规则>];
CHARSET
可以用作CHARACTER SET
的同义词。
字符集,例如
utf8mb4
;排序规则,例如
utf8mb4_general_ci
修改数据库
ALTER DATABASE <数据库名称> [[DEFAULT] {CHARACTER SET | CHARSET} <字符集>] [[DEFAULT] COLLATE <排序规则>];
删除数据库
DROP DATABASE [IF EXISTS] <数据库名称>
查看数据库
查看数据库的列表:
SHOW DATABASES [LIKE '<关键字>']
查看指定数据库的创建语句:
SHOW CREATE DATABASE <数据库名称>
数据表
创建数据表
语法:
CREATE TABLE[ IF NOT EXISTS] [<数据库名称>.]<表名>
(
<字段名1> <数据类型> [<列级别约束条件>] [COMMENT <列注释>],
<字段名2> <数据类型> [<列级别约束条件>] [COMMENT <列注释>]
...
[
<表级别约束条件>,
<表级别约束条件>
...
]
)[ENGINE = <存储引擎>] [DEFAULT {CHARACTER SET | CHARSET} = <表的默认字符集>] [COLLATE = <表的默认排序方式>] [AUTO_INCREMENT = <自增列的初始值>] [COMMENT <表注释>];
IF NOT EXISTS
如果表不存在才创建
数据类型
包括整数类型、浮点小数类型、定点小数类型、字符串类型、日期/时间类型。其中整数类型可以指定显示宽度,小数类型可以指定精度和标度,字符串类型中的
CHAR
和VARCHAR
可以指定数据长度主键约束
#列级别约束的语法
PRIMARY KEY
#表级别约束的语法
[CONSTRAINT <约束名> ]PRIMARY KEY (<字段1>[,<字段2>])
外键约束
#只能使用表级别约束
[CONSTRAINT <约束名> ]FOREIGN KEY(<字段1>[,<字段2>]) REFERENCES <主表名>(<字段1>[,<字段2>])[ ON DELETE <动作> ON UPDATE <动作>]
外键在主键更新或删除时可选的操作:
CASCADE
级联操作,删除主表的行同时删除与主键值相同的外键所在的行;更新主键时同步更新外键的值NO ACTION
无操作RESTRICT
阻碍主表的操作SET NULL
外键设为空
外键列必须要有索引,创建外键时会自动创建
索引约束
#列级别约束的语法,只有 UNIQUE 唯一索引支持
UNIQUE
#表级别约束,以下两种写法
[CONSTRAINT <约束名> ]<索引类型> {INDEX | KEY} (<字段1>[(索引长度)][,<字段2>[(索引长度)]])
[<索引类型>] [{INDEX | KEY}] [<约束名>] (<字段1>[(索引长度)][,<字段2>[(索引长度)]])
KEY
是INDEX
的同义词,是为了兼容其他数据库而设计的。MySQL 中使用时,表级别约束可以省略
INDEX
或KEY
(Oracle 中必须不带)。第二种语法定义普通索引时可以省略索引类型,此时INDEX
或KEY
不能省略。表级别约束都可以省略 “约束名”,系统会自动命名
可以使用的索引类型有:
NORMAL 普通索引
UNIQUE 唯一性索引
一个表可以设置多个唯一性约束,唯一性约束的列可以为空(但是最多只能有一行为
NULL
,多行为NULL
违反唯一性)SPATIAL 空间索引
FULLTEXT 全文索引
默认值约束
#只能用于列级别约束
DEFAULT <默认值>
不指定默认值,则默认值为
NULL
整数类型,可以指定任意在取值范围内的整数
字符串类型,可以指定任意在长度范围内的字符串,也可以指定空字符串
''
TIMESTAMP
类型的日期,可以指定默认值为当前时间CURRENT_TIMESTAMP
非空约束
#只能用于列级别约束
NOT NULL
非空约束的字段(又没有定义默认值的)在写入数据时如果为空,数据库会报错
特殊的列级别约束
AUTO_INCREMENT
设置自增列一个表只能有一个自增列;自增列必须是主键或主键的一部分;自增列必须是整数类型;初始值为 1 ,每次插入数据自动加 1
UNSIGNED
无符号整数类型和小数类型可以设置无符号,放在数据类型之后
ZEROFILL
填充零整数类型和小数类型可以设置填充零,放在数据类型之后
CHARACTER SET
和COLLATE
设置字符集和排序方式只有字符串类型的列可以设置,字符集和排序方式需要放在其他约束之前,数据类型之后
ON UPDATE CURRENT_TIMESTAMP
更新时默认写入当前时间TIMESTAMP
和DATETIME
类型的日期字段,在其他字段更新(未指定值来更新此字段)时,修改此字段为当前时间
修改数据表
修改表名
ALTER TABLE <旧表名> RENAME[ TO] <新表名>
修改字段和表约束
ALTER TABLE <表名>
CHANGE <旧字段名> <新字段名> <数据类型> [<列级别约束条件>] [COMMENT <列注释>][ FIRST | AFTER <已存在的字段名>],
MODIFY <字段名> <数据类型> [<列级别约束条件>] [COMMENT <列注释>][ FIRST | AFTER <已存在的字段名>],
ADD <字段名> <数据类型> [<列级别约束条件>] [COMMENT <列注释>][ FIRST | AFTER <已存在的字段名>],
ADD CONSTRAINT [<索引名>] [<索引类型>] [{INDEX | KEY] (<字段1>[(索引长度)][,<字段2>[(索引长度)]])
ADD [<索引类型>] [{INDEX | KEY} [<索引名>] (<字段1>[(索引长度)][,<字段2>[(索引长度)]]),
RENAME INDEX <old索引名> TO <new索引名>
DROP <字段名>,
DROP PRIMARY KEY,
DROP FOREIGN KEY <外键名>,
DROP INDEX <索引名>
ENGINE = <存储引擎>,
{CHARACTER SET | CHARSET} = <表的默认字符集>,
COLLATE = <表的默认排序方式>,
AUTO_INCREMENT = <自增列的初始值>,
COMMENT <表注释>]
修改字段名或字段属性时必须重新指定完整的字段属性,旧的字段属性不会保留,完全以新指定的属性为准。
FIRST
和AFTER
修改字段的位置
删除数据表
DROP TABLE [IF EXISTS] <表1> [,<表2> ... <表n>]
删除有关联关系的主表时,必须先解除关联关系(通过删除子表的外键约束,或者直接删除子表)
查看数据表
查看数据表的列表
SHOW TABLES [LIKE '<关键字>']
查看所有数据表的状态
SHOW TABLE STATUS [LIKE '<关键字>']
查看指定数据表的创建语句
SHOW CREATE TABLE <表名>
查看数据表的所有列
SHOW COLUMNS FROM <表名> [LIKE '<关键字>']
DESCRIBE <表名>;
查看数据表的指定列
DESCRIBE <表名> <列名>
索引
创建索引
CREATE <索引类型> INDEX <约束名> on <表名> (<字段1>[,<字段2>])
删除索引
DROP INDEX <约束名> on <表名>
查看索引
SHOW INDEX FROM <表名>