3.1、创建数据表
创建数据表指的是在已经创建好的数据库中建立新表。创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性(实体完整性、引用完整性、域完整性)约束的过程。
创建表的语法格式
数据表属于数据库,在创建数据表之前,应该先创建数据库,指定在哪个数据库中进行。
mysql> USE test; Database changed mysql> CREATE TABLE tb_name ( 字段名1,数据类型 [列级别约束条件] [默认值], 字段名2,数据类型 [列级别约束条件] [默认值], ... [表级别约束条件] );
例如创建员工表tb_emp1,表结构为:
字段名称 | 数据类型 | 备注 |
id | INT(11) | 员工编号 |
name | VARCHAR(25) | 员工名称 |
deptId | INT(11) | 所在部门编号 |
salary | FLOAT | 工资 |
mysql> USE test; Database changed mysql> CREATE TABLE tb_emp1 -> ( -> id INT(11), -> name VARCHAR(25), -> depId INT(11), -> salary FLOAT -> ); Query OK, 0 rows affected (0.08 sec) mysql> SHOW TABLES; +----------------+ | Tables_in_test | +----------------+ | tb_emp1 | +----------------+ 1 row in set (0.00 sec)
使用主键约束
主键,又称主码,是表中一列或多列的组合。主键约束要求主键列的数据唯一,并且不允许为空。主键能够唯一地标识表中的一条记录,可以结合外键来定义不同数据表之间的关系,并且可以加快数据查询的速度。主键分为单字段主键和多字段联合主键。
单字段主键由一个字段组成,其语法格式有两种:
字段名 数据类型 PRIMARY KEY [默认值] mysql> CREATE TABLE tb_emp2 -> ( -> id INT(11) PRIMARY KEY, -> name VARCHAR(25), -> depId INT(11), -> salary FLOAT -> );
[CONSTRAINT <约束名>] PRIMARY KEY [字段名] mysql> CREATE TABLE tb_emp3 -> ( -> id INT(11) , -> name VARCHAR(25), -> depId INT(11), -> salary FLOAT, -> PRIMARY KEY(id) -> );
多字段联合主键,即主键由多个字段组合,其语法格式为:
PRIMARY KEY [字段1,字段2,字段3,...] mysql> CREATE TABLE tb_emp4 -> ( -> name VARCHAR(25), -> depId INT(11), -> salary FLOAT -> PRIMARY KEY(name,depId) -> );
使用外键约束
外键用来在两个表的数据之间建立链接,它可以是一列或多列。一个表可以有一个或多个外键。外键对应的是参照完整性,一个表的外键可以为空,当不为空时,则每一个外键值必须等于另一个表中主键的某个值。
外键:它是表中的一个字段,可以不是本表的主键,但对应另一个表的主键。外键主要作用是保证数据引用的完整性,定义外键后,不允许删除在另一个表中具有关联关系的行。例如:部门表tb_dept的主键是id,在员工表tb_emp5中有一个键depId与这个id关联。
主表:对于两个具有关联关系的表而言,相关联字段中主键所在的那个表即是主表。
从表:对于两个具有关联关系的表而言,相关联字段中外键所在的那个表即是从表。
创建外键的语法规则:
[CONSTRAINT <外键名>] FOREIGN KEY 字段名1 [,字段名2,...] REFERENCES <主表名> 主键列1 [,主键列2,...]
‘外键名‘为定义的外键约束的名称,一个表中不能有相同的外键;‘字段名‘表示字表需要添加外键约束的字段列;‘主表名‘即被子表外键所依赖的表的名称;‘主键列‘表示主表中定义的主键列。
例如:定义数据表tb_emp5,并在tb_emp5上创建外键约束。
创建一个部门表:
mysql> CREATE TABLE tb_dept1( -> id INT(11) PRIMARY KEY, -> name VARCHAR(22) NOT NULL, -> location VARCHAR(50) -> ); Query OK, 0 rows affected (0.02 sec)
定义数据表tb_emp5,让它的键depId作为外键关联到tb_dept1的主键id:
mysql> CREATE TABLE tb_emp5( -> id INT(11) PRIMARY KEY, -> name VARCHAR(25), -> deptId INT(11), -> salary FLOAT, -> CONSTRAINT fk_emp_dept1 FOREIGN KEY(deptId) REFERENCES tb_dept1(id) -> ); Query OK, 0 rows affected (0.05 sec)
使用非空约束
非空约束指字段的值不能为空。对于使用非空约束的字段,如果在添加数据时没有指定值,数据库会报错。
非空约束的语法规则:
字段名 数据类型 NOT NULLL mysql> CREATE TABLE tb_emp6( -> id INT(11) PRIMARY KEY, -> name VARCHAR(25) NOT NULL, -> depId INT(11), -> salary FLOAT -> ); Query OK, 0 rows affected (0.03 sec)
使用唯一性约束
唯一性约束要求该列唯一,允许为空,但只能出现一个空值。唯一性约束可以确保一列或几列不出现重复值。
唯一性约束的语法规则有:
1、定义完列之直接指定唯一约束
字段名 数据类型 UNIQUE mysql> CREATE TABLE tb_dept2( -> id INT(11) PRIMARY KEY, -> name VARCHAR(22) UNIQUE, -> location VARCHAR(50) -> ); Query OK, 0 rows affected (0.20 sec)
2、定义完所有列之后指定唯一约束
[CONSTRAINT <约束名>] UNIQUE(<字段名>) mysql> CREATE TABLE tb_dept3( -> id INT(11) PRIMARY KEY, -> name VARCHAR(22) , -> location VARCHAR(50), -> CONSTRAINT STH UNIQUE(name) -> ); Query OK, 0 rows affected (0.03 sec)
UNIQUE和PRIMARY KEY的区别:一个表可以有多个字段声明为UNIQUE,但是只能有一个PRIMARY KEY声明,声明为PRIMARY KEY的列不允许有空值,但是声明为UNIQUE的字段允许空值(NULL)的存在。
使用默认约束
默认约束指某列的默认值。其语法规则为:
字段名 数据类型 DEFAULT 默认值 mysql> CREATE TABLE tb_emp7( -> id INT(11) PRIMARY KEY, -> name VARCHAR(25) NOT NULL, -> depId INT(11) DEFAULT 1111, -> salary FLOAT -> ); Query OK, 0 rows affected (0.03 sec)
设置表的属性值自动增加
在数据库应用中,经常希望在每次插入新纪录时,系统自动生成字段的主键值。可以通过为表主键添加AUTO_INCREMENT 关键字来实现。其语法格式为:
字段名 数据类型 AUTO_INCREMENT mysql> CREATE TABLE tb_emp8( -> id INT(11) PRIMARY KEY AUTO_INCREMENT, -> name VARCHAR(25) NOT NULL, -> depId INT(11), -> salary FLOAT -> ); Query OK, 0 rows affected (0.03 sec) mysql> INSERT INTO tb_emp8(name,salary) -> VALUES(‘Lucy‘,1000),(‘Lura‘,2000),(‘Kevin‘,3000); Query OK, 3 rows affected (0.02 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM tb_emp8; +----+-------+--------+--------+ | id | name | deptId | salary | +----+-------+--------+--------+ | 1 | Lucy | NULL | 1000 | | 2 | Lura | NULL | 2000 | | 3 | Kevin | NULL | 3000 | +----+-------+--------+--------+ 3 rows in set (0.00 sec)
查看数据表结构
使用SQL语句创建好数据表之后,可以查看表结构的定义,以确定表的定义是否正确。在MySQL中,查看表结构可以使用DESCRIBE和SHOW CREATE TABLE语句。
mysql> DESCRIBE tb_dept1; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(22) | NO | | NULL | | | location | varchar(50) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) mysql> SHOW CREATE TABLE tb_emp1 \G *************************** 1. row *************************** Table: tb_emp1 Create Table: CREATE TABLE `tb_emp1` ( `id` int(11) DEFAULT NULL, `name` varchar(25) DEFAULT NULL, `depId` int(11) DEFAULT NULL, `salary` float DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec)
3.2、修改数据表
修改数据表指的是修改数据库中已经存在的数据表的结构。MySQL使用ALTER TABLE 语句修改表。常用的修改表的操作有:修改表名、修改字段数据类型或字段名、增加和删除字段、修改字段的排列顺序、更改表的存储引擎、删除表的外键约束等。
修改表名
修改表名的语法规则为:
ALTER TABLE <旧表名> RENAME [TO] <新表名> mysql> SHOW TABLES; +----------------+ | Tables_in_test | +----------------+ | tb_dept1 | | tb_dept2 | | tb_dept3 | | tb_emp1 | | tb_emp2 | | tb_emp5 | | tb_emp6 | | tb_emp8 | +----------------+ 8 rows in set (0.00 sec) mysql> ALTER TABLE tb_dept3 RENAME TO tb_deptment3; Query OK, 0 rows affected (0.04 sec) mysql> SHOW TABLES; +----------------+ | Tables_in_test | +----------------+ | tb_dept1 | | tb_dept2 | | tb_deptment3 | | tb_emp1 | | tb_emp2 | | tb_emp5 | | tb_emp6 | | tb_emp8 | +----------------+ 8 rows in set (0.00 sec)
修改字段的数据类型
修改字段的数据类型,就是把字段的数据类型转换成另一种数据类型,其语法规则为:
ALTER TABLE <表名> MODIFY <字段名> <数据类型> mysql> DESC tb_dept1; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(22) | NO | | NULL | | | location | varchar(50) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) mysql> ALTER TABLE tb_dept1 MODIFY name VARCHAR(33); Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC tb_dept1; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(33) | YES | | NULL | | | location | varchar(50) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec)
修改字段名
MySQL中修改表字段名的语法规则为:
ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型> mysql> DESC tb_dept1; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(33) | YES | | NULL | | | location | varchar(50) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) mysql> ALTER TABLE tb_dept1 CHANGE location loc VARCHAR(50); Query OK, 0 rows affected (0.13 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC tb_dept1; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(33) | YES | | NULL | | | loc | varchar(50) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec)
添加字段
添加字段的语法格式为:
ALTER TABLE <表名> ADD <新字段> <数据类型> [约束条件] [FIRST|AFTER 已存在字段名]
添加无完整约束条件的字段
mysql> ALTER TABLE tb_dept1 ADD managerId INT(10); Query OK, 0 rows affected (0.05 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC tb_dept1; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(33) | YES | | NULL | | | loc | varchar(50) | YES | | NULL | | | managerId | int(10) | YES | | NULL | | +-----------+-------------+------+-----+---------+-------+ 4 rows in set (0.00 sec)
添加有完整约束条件的字段
mysql> ALTER TABLE tb_dept1 ADD column1 VARCHAR(12) NOT NULL; Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC tb_dept1; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(33) | YES | | NULL | | | loc | varchar(50) | YES | | NULL | | | managerId | int(10) | YES | | NULL | | | column1 | varchar(12) | NO | | NULL | | +-----------+-------------+------+-----+---------+-------+ 5 rows in set (0.00 sec)
在表的第一列添加字段
mysql> ALTER TABLE tb_dept1 ADD column2 INT(11) FIRST; Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC tb_dept1; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | column2 | int(11) | YES | | NULL | | | id | int(11) | NO | PRI | NULL | | | name | varchar(33) | YES | | NULL | | | loc | varchar(50) | YES | | NULL | | | managerId | int(10) | YES | | NULL | | | column1 | varchar(12) | NO | | NULL | | +-----------+-------------+------+-----+---------+-------+ 6 rows in set (0.00 sec)
在表的指定列之后添加字段
mysql> ALTER TABLE tb_dept1 ADD column3 INT(11) AFTER name; Query OK, 0 rows affected (0.05 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC tb_dept1; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | column2 | int(11) | YES | | NULL | | | id | int(11) | NO | PRI | NULL | | | name | varchar(33) | YES | | NULL | | | column3 | int(11) | YES | | NULL | | | loc | varchar(50) | YES | | NULL | | | managerId | int(10) | YES | | NULL | | | column1 | varchar(12) | NO | | NULL | | +-----------+-------------+------+-----+---------+-------+ 7 rows in set (0.00 sec)
删除字段
删除字段是将数据表中的某个字段从表中移除,其语法格式为:
ALTER TABLE <表名> DROP <字段名> mysql> DESC tb_dept1; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | column2 | int(11) | YES | | NULL | | | id | int(11) | NO | PRI | NULL | | | name | varchar(33) | YES | | NULL | | | column3 | int(11) | YES | | NULL | | | loc | varchar(50) | YES | | NULL | | | managerId | int(10) | YES | | NULL | | | column1 | varchar(12) | NO | | NULL | | +-----------+-------------+------+-----+---------+-------+ 7 rows in set (0.00 sec) mysql> ALTER TABLE tb_dept1 DROP column2; Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC tb_dept1; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(33) | YES | | NULL | | | column3 | int(11) | YES | | NULL | | | loc | varchar(50) | YES | | NULL | | | managerId | int(10) | YES | | NULL | | | column1 | varchar(12) | NO | | NULL | | +-----------+-------------+------+-----+---------+-------+ 6 rows in set (0.00 sec)
修改字段的排列位置
对一个数据表来说,在创建的时候,字段在表中的排列顺序已经确定。但是表的结构并不是完全不能改变,可以通过ALTER TABLE来改变表中字段的相对位置,语法格式为:
ALTER TABLE <表名> MODIFY <字段1> <数据类型> FIRST|AFTER <字段2>
修改字段为表的第一个字段
mysql> ALTER TABLE tb_dept1 MODIFY column1 VARCHAR(12) FIRST; Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC tb_dept1; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | column1 | varchar(12) | YES | | NULL | | | id | int(11) | NO | PRI | NULL | | | name | varchar(33) | YES | | NULL | | | column3 | int(11) | YES | | NULL | | | loc | varchar(50) | YES | | NULL | | | managerId | int(10) | YES | | NULL | | +-----------+-------------+------+-----+---------+-------+ 6 rows in set (0.00 sec)
修改字段到表的指定列之后
mysql> ALTER TABLE tb_dept1 MODIFY column1 VARCHAR(12) AFTER loc; Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC tb_dept1; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(33) | YES | | NULL | | | column3 | int(11) | YES | | NULL | | | loc | varchar(50) | YES | | NULL | | | column1 | varchar(12) | YES | | NULL | | | managerId | int(10) | YES | | NULL | | +-----------+-------------+------+-----+---------+-------+ 6 rows in set (0.00 sec)
更改表的存储引擎
更改表的数据引擎语法格式为:
ALTER TABLE <表名> ENGINE=<更改后的存储引擎> mysql> SHOW CREATE TABLE tb_deptment3 \G *************************** 1. row *************************** Table: tb_deptment3 Create Table: CREATE TABLE `tb_deptment3` ( `id` int(11) NOT NULL, `name` varchar(22) DEFAULT NULL, `location` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `STH` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec) mysql> ALTER TABLE tb_deptment3 ENGINE=MyISAM; Query OK, 0 rows affected (0.06 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SHOW CREATE TABLE tb_deptment3 \G *************************** 1. row *************************** Table: tb_deptment3 Create Table: CREATE TABLE `tb_deptment3` ( `id` int(11) NOT NULL, `name` varchar(22) DEFAULT NULL, `location` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `STH` (`name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 1 row in set (0.00 sec) mysql>
删除表的外键约束
对于数据库中定义的外键,如果不再需要,可以将其删除。外键一旦删除,就会解除主表和从表之间的关联关系,MySQL中删除外键的语法格式为:
ALTER TABLE <表名> FROP FOREIGN KEY <外键约束名>
mysql> CREATE TABLE tb_emp9 #创建带有外键约束的表 -> ( -> id INT(11) PRIMARY KEY, -> name VARCHAR(25), -> deptId INT(11), -> salary FLOAT, -> CONSTRAINT fk_emp_dept FOREIGN KEY (deptId) REFERENCES tb_dept1(id) -> ); Query OK, 0 rows affected (0.03 sec) mysql> SHOW CREATE TABLE tb_emp9 \G *************************** 1. row *************************** Table: tb_emp9 Create Table: CREATE TABLE `tb_emp9` ( `id` int(11) NOT NULL, `name` varchar(25) DEFAULT NULL, `deptId` int(11) DEFAULT NULL, `salary` float DEFAULT NULL, PRIMARY KEY (`id`), KEY `fk_emp_dept` (`deptId`), CONSTRAINT `fk_emp_dept` FOREIGN KEY (`deptId`) REFERENCES `tb_dept1` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec) mysql> ALTER TABLE tb_emp9 DROP FOREIGN KEY fk_emp_dept; Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SHOW CREATE TABLE tb_emp9 \G *************************** 1. row *************************** Table: tb_emp9 Create Table: CREATE TABLE `tb_emp9` ( `id` int(11) NOT NULL, `name` varchar(25) DEFAULT NULL, `deptId` int(11) DEFAULT NULL, `salary` float DEFAULT NULL, PRIMARY KEY (`id`), KEY `fk_emp_dept` (`deptId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec)
3.3、删除数据表
删除没有被关联的表
在MySQL中,使用DROP TABLE 可以一次删除一个或多个没有被其他表关联的数据表,语法格式为:
DROP TABLE [IF EXISTS] 表1,表2,...表n mysql> DROP TABLE IF EXISTS tb_dept2; Query OK, 0 rows affected (0.04 sec) mysql> SHOW TABLES; +----------------+ | Tables_in_test | +----------------+ | tb_dept1 | | tb_deptment3 | | tb_emp1 | | tb_emp2 | | tb_emp5 | | tb_emp6 | | tb_emp8 | | tb_emp9 | +----------------+ 8 rows in set (0.00 sec)
删除被其他表关联的主表
数据表之间存在外键关联的情况下,如果直接删除父表,结果会显示失败。原因是直接删除,将破坏表的参照完整性。如果必须删除,可以先删除外键约束,再删除父表。
mysql> CREATE TABLE tb_dept2 ( id INT(11) PRIMARY KEY, name VARCHAR(25), location VARCHAR(50) ); #创建父表 Query OK, 0 rows affected (0.03 sec) mysql> CREATE TABLE tb_emp ( id INT(11) PRIMARY KEY, name VARCHAR(25), de ptId INT(11), salary FLOAT, CONSTRAINT fk_emp_dept FOREIGN KEY (deptId) R EFERENCES tb_dept2(id) ); #创建子表,外键约束 Query OK, 0 rows affected (0.03 sec) mysql> DROP TABLE tb_dept2; #无法父表删除 ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails mysql> ALTER TABLE tb_emp DROP FOREIGN KEY fk_emp_dept; #删除子表外键 Query OK, 0 rows affected (0.10 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DROP TABLE tb_dept2; #成功删除父表 Query OK, 0 rows affected (0.02 sec)