DDL操作总结
DDL(Data Define Language,数据定义语言):主要⽤来对数据库、表进⾏⼀些管理操作。 如:建库、删库、建表、修改表、删除表、对列的增删改等等。
⽂中涉及到的语法⽤[]包含的内容属于可选项,用<>包含的内容为实际操作中替换项,命令的详细语法可在MySQL中使用help <命令名称>查看,下列为常用语法总结及示例。
数据库管理语句
1. 创建数据库
CREATE DATABASE [IF NOT EXISTS] <数据库名>;
mysql> CREATE DATABASE test;
Query OK, 1 row affected (0.01 sec)
2. 删除数据库
DROP DATABASE [IF EXISTS] db_name;
数据表管理语句
1.创建数据表
CREATE TABLE 表名( <字段名1> <类型> [约束条件] [COMMENT '<字段说明>'], <字段名2> <类型> [约束条件] [COMMENT '<字段说明>'], <字段名3> <类型> [约束条件] [COMMENT '<字段说明>'] );
2.完整性约束条件
完整性约束条件用于保护数据库中数据的完整性,MySQL中常见完整性约束如下:
PRIMARY KEY (PK):标识该字段为主键,用于唯一标识元组,若插入记录操作导致主键重复则会插入失败并报错
该约束有两种创建方式:
一种是跟在该字段创建语句之后
一种是在所有字段创建语句之后
方式二也可用于创建组合主键
FROEIGN KEY (FK):用于标识字段为外键,创建语法为
FOREIGN KEY(<当前字段名> ,[<当前字段名>]) REFERENCES <外键表名>(<外键字段名>[,<外键字段名>])
注:
• 两张表中需要建⽴外键关系的字段类型需要⼀致
• 要设置外键的字段不能为主键
• 被引⽤的字段需要为主键
• 被插⼊的值在外键表必须存在
UNIQUE KEY (UK):用于标识字段值唯一,插入重复的值会插入失败。
创建语法与主键一致,可在要创建的字段创建语句之后,也可在所有字段的创建语句之后,在所有字段创建语句之后时可创建多个字段。
NOT NULL:用于标识字段非空
mysql> CREATE TABLE test(
-> field INT NOT NULL
-> );
Query OK, 0 rows affected (0.06 sec)
DEFAULT VALUE:用于为字段设置默认值
mysql> CREATE TABLE test(
-> field1 VARCHAR(10) DEFAULT 'aaa',
-> field2 INT DEFAULT 0
-> );
Query OK, 0 rows affected (0.05 sec)
AUTO_INCREMENT:用于标识字段自动增长,设置自动增长的字段必须为整数类型且为主键
mysql> CREATE TABLE test(
-> field1 INT PRIMARY KEY AUTO_INCREMENT,
-> field2 VARCHAR(10)
-> );
Query OK, 0 rows affected (0.04 sec)
注:自增字段的初始值和步长可在mysql数据库中通过修改配置文件设置,默认初始值和步长都为1,⾃增长字段的当前值存储在内存中,数据库每次重启之后,会查询当前表中⾃增字段的最⼤值作 为当前值,如果表数据被清空之后,数据库重启了,⾃增字段的值将从初始值开始
3.修改表名
一般语法: ALTER TABLE <当前表名> RENAME [TO] <新表名>;
mysql> ALTER TABLE test RENAME new_test;
Query OK, 0 rows affected (0.04 sec)
4.设置表备注
一般语法: ALTER TABLE <表名> COMMENT '<备注信息>';
mysql> ALTER TABLE test COMMENT '测试表';
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
5.复制表
只复制表结构
CREATE TABLE <表名> LIKE <被复制表名>;
mysql> DESC test0;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| field1 | int | NO | PRI | NULL | |
| field2 | varchar(10) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> CREATE TABLE test1 LIKE test0;
Query OK, 0 rows affected (0.05 sec)
mysql> DESC test1;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| field1 | int | NO | PRI | NULL | |
| field2 | varchar(10) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
复制表结构+数据
CREATE TABLE <表名> [AS] SELECT <字段名>,... FROM <被复制表> [WHERE 条件];
mysql> SELECT * FROM test0;
+--------+--------+
| field1 | field2 |
+--------+--------+
| 1 | aaa |
+--------+--------+
1 row in set (0.00 sec)
mysql> CREATE TABLE test1 AS SELECT * FROM test0;
Query OK, 1 row affected (0.07 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM test1;
+--------+--------+
| field1 | field2 |
+--------+--------+
| 1 | aaa |
+--------+--------+
1 row in set (0.00 sec)
6.删除表
DROP TABLE <表名>;
mysql> DROP TABLE test1;
Query OK, 0 rows affected (0.06 sec)
7.表中字段管理
添加字段或约束
ALTER TABLE <表名> ADD COLUMN <列名> <类型> [约束条件];
mysql> ALTER TABLE test ADD COLUMN field3 INT NOT NULL;
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC test;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| field1 | int | NO | PRI | NULL | auto_increment |
| field2 | varchar(10) | YES | | NULL | |
| field3 | int | NO | | NULL | |
+--------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
mysql> ALTER TABLE test ADD UNIQUE(field3);
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW COLUMNS FROM test;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| field1 | int | NO | PRI | NULL | auto_increment |
| field2 | varchar(10) | YES | | NULL | |
| field3 | int | NO | UNI | NULL | |
+--------+-------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)
修改字段或约束
ALTER TABLE <表名> MODIFY COLUMN <列名> <新类型> [约束]; ALTER TABLE <表名> CHANGE COLUMN <列名> <新列名> <新类型> [约束];
注:MODIFY和CHANGE的不同在于CHANGE可以修改列名
mysql> ALTER TABLE test MODIFY field3 VARCHAR(10) NULL;
Query OK, 0 rows affected (0.16 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC test;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| field1 | int | NO | PRI | NULL | auto_increment |
| field2 | varchar(10) | YES | | NULL | |
| field3 | varchar(10) | YES | UNI | NULL | |
+--------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
mysql> ALTER TABLE test CHANGE field3 age INT NOT NULL;
Query OK, 0 rows affected (0.21 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC test;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| field1 | int | NO | PRI | NULL | auto_increment |
| field2 | varchar(10) | YES | | NULL | |
| age | int | NO | UNI | NULL | |
+--------+-------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)
删除字段或约束
ALTER TABLE <表名> DROP COLUMN <列名>;
mysql> ALTER TABLE test DROP age;
Query OK, 0 rows affected (0.15 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC test;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| field1 | int | NO | PRI | NULL | auto_increment |
| field2 | varchar(10) | YES | | NULL | |
+--------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)