一.数据表
1.概述
数据表(或称表)是数据库最重要的组成部分之一,是其他对象的基础。
2.使用数据库
创建数据表之前要打开数据库,并使用数据库(命令:USE database_name;)
可以使用命令:SELECT DATABASE(); 展示当前使用的数据库。
3.创建数据表
语法:CREATE TABLE [IF NOT EXISTS] table_name (column_name data_type,...)
# 创建一个简单的用户表
CREATE TABLE IF NOT EXISTS user(
username VARCHAR(20),
age TINYINT UNSIGNED
);
4.查看数据表列表
SHOW TABLES [FROM db_name][LIKE 'pattern' | WHERE expr]
# 查看当前数据库下的表
SHOW TABLES;
# 查看mysql数据库下的表,不会切换使用的库
SHOW TABLES FROM mysql;
5.查看数据表结构
- SHOW COLUMNS FROM tbl_name;
- DESC tbl_name;
6.插入数据
语法:INSERT [INTO] tbl_name [(col_name,...)] VALUES (val,...)
# 不写字段名称则必须给所有字段赋值
INSERT USER VALUES ('kim',18);
# 写字段名称可以只赋对应字段值
INSERT USER(username) VALUES ('kimtian');
7.空值与非空
- NULL,字段值可以为空
- NOT NULL 字段值禁止为空
8.自动编号AUTO_INCREMENT
- 自动编号,且必须与主键组合使用
- 默认情况下,起始值为1,每次的增量为1
自动编号字段可以是整数或是浮点数,浮点数的小数位一定为0。
自动编号的字段一定得是主键,但主键不一定是AUTO_INCREMENT。
二.约束
约束可以保证数据的完整性和一致性;约束分为表级约束和列级约束。
1.PRIMARY KEY主键约束
- 每张数据表只能存在一个主键
- 主键保证记录的唯一性
- 主键自动为NOT NULL
# 自增主键,使用 PRIMARY KEY
CREATE TABLE IF NOT EXISTS user4(id INT(2) UNSIGNED AUTO_INCREMENT PRIMARY KEY,username VARCHAR(20) UNIQUE KEY,age TINYINT UNSIGNED,salary FLOAT(9,2) UNSIGNED);
# 自增主键,直接使用 KEY也是OK的,但建议直接使用 PRIMARY KEY,可读性好,比较统一
CREATE TABLE IF NOT EXISTS user5(id INT(2) UNSIGNED AUTO_INCREMENT KEY,username VARCHAR(20) UNIQUE KEY,age TINYINT UNSIGNED,salary FLOAT(9,2) UNSIGNED);
# 非自增主键
CREATE TABLE IF NOT EXISTS user6(id INT(2) UNSIGNED PRIMARY KEY,username VARCHAR(20) UNIQUE KEY,age TINYINT UNSIGNED,salary FLOAT(9,2) UNSIGNED);
创建完成后,可以使用desc tablename;命令,查看表结构,主键是否增加成功。
如图所示可以看到主键创建成功。
2.UNIQUE KEY 唯一约束
- 唯一约束可以保证记录的唯一性;
- 唯一约束的字段可以为NULL;
- 每张数据表可以存在多个唯一约束。
# 为username字段 设置唯一约束
CREATE TABLE IF NOT EXISTS user4(id INT(2) UNSIGNED AUTO_INCREMENT PRIMARY KEY,username VARCHAR(20) UNIQUE KEY,age TINYINT UNSIGNED,salary FLOAT(9,2) UNSIGNED);
创建完成后,可以使用命令desc tablename;,查看表结构,唯一约束是否增加成功。
如图所示可以看到唯一约束创建成功。
设置唯一约束的元素要有唯一性不能重复。如果username重复数据库会报错:
ERROR 1062 (23000): Duplicate entry 'kimtian' for key 'username'
3.DEFAULT 默认约束
- 默认值;
- 当插入记录时,如果没有明确为字段赋值,则自动赋予默认值。
# 为sex性别字段设置默认值,1表示男,2表示女,3表示保密,不传时候默认为3
CREATE TABLE tbl(id INT(2) UNSIGNED AUTO_INCREMENT PRIMARY KEY,age TINYINT UNSIGNED,sex ENUM('1','2','3') DEFAULT '3');
向表table中插入一条数据:
# 只给年龄赋值了
insert tbl (age) VALUES (18);
我们没并没有给性别赋值。查看表数据,可以看到性别默认被填写了3。
4.NOT NULL 非空约束
# area地域字段不能为空
CREATE TABLE tbl1(id INT(2) UNSIGNED AUTO_INCREMENT PRIMARY KEY,age TINYINT UNSIGNED,sex ENUM('1','2','3') DEFAULT '3',area varchar(20) NOT NULL);
area地域字段不能为空,所以我们在插入数据时候,必须给area字段赋值,否则会报错:ERROR 1364 (HY000): Field 'area' doesn't have a default value
同样如果给area赋值NULL也会报这个错误:
5.FOREIGN KEYp 外键约束
- 保证数据一致性,完整性;
- 实现一对一或一对多关系。
创建外键约束的要求:
- 父表和子表必须使用相同的存储引擎,而且禁止使用临时表;
- 数据表的存储引擎只能为InnoDB;
- 外建列和参照列必须具有相似的数据类型。其中数字长度或是否有符号位必须相同,而字符的长度则可以不同;
- 外键列和参照列必须创建索引,如果外键列不存在索引的话,MySQL将会自动创建索引。
如下,创建两张表,一张省份表,一张城市表,城市表有个外键pid,参照省份表的id列。
# 省份表--参照表,也称作父表,id为参照列。
CREATE TABLE provinces(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,pname VARCHAR(20) NOT NULL);
# 城市表--子表,pid为外键列。
CREATE TABLE citys(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,cityname VARCHAR(20) NOT NULL,pid SMALLINT UNSIGNED, FOREIGN KEY (pid) REFERENCES provinces(id));
外键约束的参照条件:
CASCADE | 从父表删除或更新时,自动删除和更新子表中匹配的行。 |
SET NULL | 从父表删除或更新行时,设置子表中的外键列为NULL,如果使用该选项,必须保证子表外键列没有指定NOT NULL。 |
RESTRICT | 拒绝对父表的更新或删除操作。 |
NO ACTION | 标准SQL的关键字,在MySQL中与RESTRICT相同。 |
默认 | 拒绝对父表的更新或删除操作。 |
用法如下:
# ON DELETE CASCADE 删除时,自动删除和更新子表中匹配的行。
CREATE TABLE citys1(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,cityname VARCHAR(20) NOT NULL,pid SMALLINT UNSIGNED, FOREIGN KEY (pid) REFERENCES provinces(id) ON DELETE CASCADE);
使用命令SHOW CREATE TABLE tbl_name;
可以查看到以下信息:
(1)ENGINE=InnoDB引擎是InnoDB。
(2)KEY `pid` (`pid`)。外键列pid已经被自动创建了索引。
(3)CONSTRAINT `citys_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `provinces` (`id`)外键索引被成功创建,外键索引名称为citys_ibfk_1。
也可以使用命令SHOW INDEX FROM tab_name;查看表中索引情况。
6.表级约束与列级约束
表级约束 | 列级约束 |
对多个数据列建议的约束,称为表级约束。 | 对一个数据列建立的约束,称为列级约束。 |
只能在列定义后生命 | 可以在列定义时声明,也可以在列定义后声明。 |
很少使用。 | 常用。 |
只支持外键约束,主键约束,唯一约束。不支持非空约束 和 默认约束。 | 外键约束,主键约束,唯一约束,非空约束,默认约束全都支持。 |
三.修改数据表
1.添加和删除列
(1)添加单列
语法:ALTER TABLE tbl_name ADD [COLUMN] col_name column_definaition [FIRST | AFTER col_name]
如果后面[FIRST | AFTER col_name]这部分省略,则新增字段默认加在所有列的后面。
#testalter1字段加在了最前面
ALTER TABLE citys ADD testalter1 varchar(20) FIRST;
#testalter2字段加在了cityname字段的后面
ALTER TABLE citys ADD testalter2 varchar(20) AFTER cityname ;
#后面省略默认加在所有列的最后面
ALTER TABLE citys ADD testalter3 varchar(20);
再查看表结构可以看到新增了3个字段,位置和我们要求的一致。
(2)添加多列
语法:ALTER TABLE tbl_name ADD [COLUMN] (col_name column_definaition,...)
# 多列不能指定位置,默认加在所有列的最后面
ALTER TABLE citys ADD (testalter4 varchar(20),testalter5 varchar(20) );
(3)删除列
语法:ALTER TABLE tbl_name DROP [COLUMN] col_name
# 删除单列
ALTER TABLE citys DROP testalter1;
# 删除多列
ALTER TABLE citys DROP testalter2, DROP testalter3, DROP testalter4;
# 删除某列,并增加num列
ALTER TABLE citys DROP testalter5 , ADD num int(20) AFTER cityname;
2.添加和删除主键约束
(1)添加主键约束
ALTER TABLE tbl_name ADD [CONSTARAINT [symbol]] PRIMARY KEY [index_type] (index_col_name)
# [CONSTARAINT [symbol]] 表示约束的名称
# [index_type]表示索引的类型,有hash树和B树索引,现在默认是B树
# 创建user表,未给任何约束
CREATE TABLE IF NOT EXISTS user(id INT(2) UNSIGNED ,username VARCHAR(20),age TINYINT UNSIGNED,salary FLOAT(9,2) UNSIGNED);
# 添加主键约束
ALTER TABLE user ADD CONSTRAINT pk_user_id PRIMARY KEY(id);
使用命令desc user;查看表结构,可以看到id字段加了PRIMARY KEY.
(2)删除主键约束
语法:ALTER TABLE tbl_name DROP PRIMARY KEY
# 删除主键约束,并不用指定名称,因为任何一个数据表有且只有一个主键
ALTER TABLE user DROP PRIMARY KEY;
再次使用命令desc user;查看表结构,可以看到id字段的主键约束已经被删除。
3.添加和删除唯一约束
(1)添加唯一约束
ALTER TABLE tbl_name ADD [CONSTARAINT [symbol]] UNIQUE [INDEX | KEY] [index_name] [index_type](index_col_name,...)
# 添加唯一约束,唯一约束可以有多个
ALTER TABLE user ADD UNIQUE(username);
使用命令desc user;查看表结构,可以看到username字段加了UNIQUE KEY.
(2)删除唯一约束
ALTER TABLE tbl_name DROP {INDEX | KEY} index_name
# 删除唯一约束,唯一约束要指定名称,因为可能有多个唯一约束
ALTER TABLE user DROP INDEX username;
4.添加和删除外键约束
(1)添加外键约束
ALTER TABLE tbl_name ADD [CONSTARAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...) reference_definition
# 创建一个城市表
CREATE TABLE citys(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,cityname VARCHAR(20) NOT NULL,pid SMALLINT UNSIGNED);
# 添加外键约束
ALTER TABLE citys ADD FOREIGN KEY(pid) REFERENCES provinces(id);
使用命令SHOW CREATE TABLE citys ;可以看到加上了外键约束。
(2)删除外键约束
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol
# 删除外键约束
ALTER TABLE citys DROP FOREIGN KEY citys_ibfk_1;
# 删除索引(外键约束删除后MySQL自动加的索引依然存在,需要的话可以继续删除索引)
ALTER TABLE citys DROP INDEX pid;
5.添加和删除默认约束
(1)添加默认约束
ALTER TABLE tbl_name ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
# 添加默认约束,给age字段默认值为15
ALTER TABLE user ALTER age SET DEFAULT 15;
使用命令desc user;查看表结构,可以看到age字段加了Default默认值15。
(2)删除默认约束
ALTER TABLE tbl_name ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
# 删除默认约束
ALTER TABLE user ALTER age DROP DEFAULT;
使用命令desc user;查看表结构,可以看到age字段的默认值被删除。
6.修改列定义
(1)修改列定义
ALTER TABLE tbl_name MODIFY [COLUMN] col_name column_definaition [FIRST | AFTER col_name]
# 列名字不存在问题,但定义类型和顺序有问题使用MODIFY
# 修改位置,字段类型不变
ALTER TABLE user MODIFY salary FLOAT(9,2) UNSIGNED AFTER username;
# 修改类型.要注意大类型改到小类型有可能造成数据的丢失。
ALTER TABLE user MODIFY age INT(2) UNSIGNED AFTER id;
7.数据表和数据列更名
尽量少使用数据表更名和数据列名更名。因为创建了索引,或曾经使用过视图和存储过程的情况下,修改可能会导致某些视图和存储过程无法正常工作。
(1)修改列名称
ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name new_col_name column_definaition [FIRST | AFTER col_name]
# 修改列定义和列名称
ALTER TABLE user CHANGE id user_id TINYINT(2) FIRST;
(2)修改表名称
方法一:
ALTER TABLE tbl_name RENAME [TO | AS] new_tbl_name
方法二:
RENAME TABLE tbl_name TO new_tbl_name [,tbl_name2 TO new_tbl_name]
# 修改表名称--方法一
ALTER TABLE user RENAME user10;
# 修改表名称--方法二,可以多张表更名
RENAME TABLE user1 TO user11,user2 TO user12;