#创建一个库;如果存在,则报错; create database 库名; #判断库是否不存在,若是,则创建; create database if not exists 库名;
库的修改
更改库的字符集
alter database 库名 character set 新字符集;#如utf-8 改为 gbk
库的删除
#删除一个库,若不存在,则报错; drop database 库名; #判断库是否存在,若是,则删除; drop database if exists 库名;
表的创建
语法
create table 表名 ( 列名 列的类型 【(长度) 约束】, 列名 列的类型 【(长度) 约束】, ... 列名 列的类型 【(长度) 约束】 );
表的修改
#语法格式 alter table 表名 change|modify|add|drop column / rename to 字段 【数据类型/约束】 / 表名;
修改列名
alter table 表名 change column 旧列名 新列名 新数据类型;
修改列的类型或约束
alter table 表名 modify column 列名 新类型或新约束;
添加新列
alter table 表名 add column 列名 数据类型;
删除列
alter table 表名 drop column 列名;
修改表名
alter table 表名 rename to 新表名;
表的删除
#判断是否存在表,若是,则删除; drop table if exists 表名;
通用的写法
#库的删除和创建; drop database if exists 旧库名; create database 新库名; #表的删除和创建; drop table if exists 旧表名; create table 新表名;
表的复制
复制表的结构
create table 新表名 like 旧表名;
复制表的结构和数据内容
create table 新表名 (select * from 旧表名);
复制表的部分结构
create table 新表名 (select 需复制的字段 from 旧表名 where 0【结果为false即可】);
复制表的部分结构和部分数据内容
create table 新表名 (select 需复制的字段 from 旧表名 where 筛选内容的条件);
显示当前库的所有表名
show tables;
显示表的结构
desc 表名;
整数类型 字节数 范围大小 Tinyint 1 有符号:[-2^7,2^7 - 1];无符号:[0,2^8] Smallint 2 有符号:[-2^(15),2^(15) - 1];无符号:[0,2^(16)] Mediumint 3 有符号:[-2^(23),2^(23) - 1];无符号:[0,2^(24)] Int、integer 4 有符号:[-2^(31),2^(31) - 1];无符号:[0,2^(32)] Bigint 8 有符号:[-2^(63),2^(63) - 1];无符号:[0,2^(64)]
浮点数类型 字节 float(M,D) 4 double(M,D) 8
给定数类型 字节 范围 DEC(M,D) M + 2 最大取值范围与 double 相同, DECIMAL(M,D) M + 2 给定 decimal 的有效取值范围由 M 和 D 决定;
较短字符串类型 最多字符数 描述及存储需求 char(M) M M 为 0~255 之间的整数 varchar(M) M M 为 0~65535 之间的整数
特点:
Enum 枚举类型
该类型下,插入值只能是列表成员中的指定值之一;
create table 表名 ( 字段 enum(列表成员) )
set 集合类型
与枚举类型相似,区别于的是,可以选取列表成员中的多个指定值;
binary 和 varbinary 二进制类型
类似 char 和 varchar,区别于的是,用于保存较短的二进制数据;
日期和时间类型 字节 最小值 最大值 date 4 1000-01-01 9999-12-31 datetime 8 1000-01-01 00:00:00 9999-12-31 23:59:59 timestamp 4 1970-01-01 08:00:01 2038年的某一刻 time 3 -838:59:59 838:59:59 year 1 1901 2155
含义:一种限制,用于限制表中的数据,为了保证表中的数据的准确性和可靠性;
分类:六大约束
添加约束的时机:
create table 表名 ( 字段 数据类型 列级约束, 字段 数据类型 列级约束, 表级约束 )
列级约束
语法:
字段名 字段类型 约束类型
直接在字段名和类型后面追加 约束类型即可;
mysql仅支持:默认、非空、主键、唯一;
# 检查和外键不作为列级约束,这里执行无效果; CREATE DATABASE students; USE students; CREATE TABLE stuinfo ( id INT PRIMARY KEY, #主键 stuName VARCHAR(20) NOT NULL, #非空 gender CHAR(1) CHECK(gender = '男' OR gender = '女'), #检查 seat INT UNIQUE, #唯一 age INT DEFAULT 18, #默认 majorid INT REFERENCES major(id) #外键 ); CREATE TABLE major ( id INT PRIMARY KEY, majorName VARCHAR(20) ); SHOW INDEX FROM stuinfo; DESC stuinfo;
表级约束
语法:
【constraint 约束名】 约束类型(字段名)
约束名省略,默认为字段名,除了主键是 primary;
mysql 不支持 非空约束 和 默认约束;
CREATE DATABASE students; USE students; CREATE TABLE stuinfo ( id INT, stuName VARCHAR(20), gender CHAR(1), seat INT, age INT, majorId INT, CONSTRAINT pk PRIMARY KEY(id), #主键 CONSTRAINT uq UNIQUE(seat), #唯一 CONSTRAINT ck CHECK(gender = '男' OR gender = '女'), #检查 CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorId) REFERENCES major(id) #外键 ); CREATE TABLE major ( id INT PRIMARY KEY, majorName VARCHAR(20) ); SHOW INDEX FROM stuinfo; DESC stuinfo;
列级约束 和 表级约束的对比
位 置 支持的约束类型(检查都MySQL不支持) 是否可起约束名 列级约束 列的后面 语法都支持,当外键没有效果 不可以 表级约束 所有列的下面 默认和非空不支持,其它支持 可以,主键没有效果
通用的写法
外键约束 一般写在 表级约束中,其它约束 一般写在 列级约束;
create table stuinfo ( id int primary key, stuName varchar(20) not null, sex char(1), age int default 18, seat int unique, majorId int, constraint fk_stuinfo_major foreign key(majorId) references major(id); )
保证唯一性 是否允许为空 在表中的数量 是否允许组合字段 主键约束 ✔ × 至多一个 ✔ 唯一约束 ✔ ✔ 可以有多个 ✔
外键约束的特点
要求在 从表 设置外键关系;
从表的外键列的类型和主表的关联列的类型要求一致或兼容,字段名无要求;
主表的关联列必须是一个 key (一般是主键 或唯一);
插入数据时,先插入主表,再插入从表;
删除数据时,先删除从表,再删除主表;
级联删除:可以做到直接删除主表被约束的字段,同时从表对应的数据行也会被删除;
alter table 从表 add constraint 外键名 foreign key(从表字段) references 主表(字段) on delete cascade;
级联置空:类似级联删除,但是不会将从表对应整行数据删除,只是会在外键字段的位置置空;
alter table 从表 add constraint 外键名 foreign key(从表字段) references 主表(字段) on delete set null;
修改表时添加约束
语法:
#添加列级约束 alter table 表名 modify column 字段名 字段类型 新约束; #添加表级约束 alter table 表名 add 【constraint 约束名】 约束类型(字段名) 【外键引用】;
案例:
create table stuinfo ( id int, stuname varchar(20), gender char(1), seat int, age int, majorid int )
添加非空约束
alter table stuinfo modify column stuname varchar(20) not null;
添加默认约束
alter table stuinfo modify column age int default 18;
添加主键
#列级约束 alter table stuinfo modify column id int primary key; #表级约束 alter table stuinfo add 【constraint 约束名】 primary key(id);
添加唯一
#列级约束 alter table stuinfo modify column seat int unique; #表级约束 alter table stuinfo add unique(seat);
添加外键
#只有表级约束 alter table stuinfo add 【constraint fk_stuinfo_major】 foreign key(majorid) references major(id);
修改表时删除约束
删除非空约束
alter table stuinfo modify column stuname varchar(20) null;
删除默认约束
alter table stuinfo modify column age int;
删除主键
alter table stuinfo drop primary key;
删除唯一
alter table stuinfo drop index seat; #默认约束名为字段名,若约束名更改,这里的约束名也要随之更改;
删除外键
alter table stuinfo drop foreign key fk_stuinfo_major; #这里用的也是约束名;
标识列
创建表时设置标识列
create table stuinfo ( id int primary key auto_increment, stuName varchar(20) );
修改表时设置标识列
alter table stuinfo modify column id int primary key auto_increment;
修改表时删除标识列
alter table stuinfo modify column id int primary key;