一、数据类型:
1、数值型
(1)整型:
整数类型(Tinyint(1)、Smallint(2)、Mediumint(3)、Int/integer(4)、Bigint(8))
int:默认有符号(-32768~32767),设置无符号:t1 INT UNSIGNED
t2 INT(5) ZEROFILL #长度不够5,左边用0填充,并且默认为无符号型。
(2)小数:
1)浮点型:float(4字节)、double(8字节)——或者:float(M,D)
2)定点型:精确度较高的小数
DEC(M,D):M可省略,M为整数部分+小数部分最大总长度,D为小数部分最大位数,字节大小为M+2,最大范围同double,
而float和double只要别超最大范围就行,会根据插入数值的精度来决定精度。
**原则:**所选择类型越简单越好,能保存数值情况下,类型越小越好。
2、字符型:
(1)较短的文本
char(M):该字段最多的字符数为M(0~255,可以省略,默认为1),固定长度字符,比较耗费空间,效率高. eg: sex char
varchar(M):可变长度字符(M为0~65535之间的整数),比较节省空间,效率低
(2)较长的文本
text、blob(较长的二进制数据)
(3)其他
binary和varbinary:用于保存较短的二进制
enum:用于保存枚举
set:用于保存集合
#1.enum枚举
CREATE TABLE tab_char(
c1 ENUM('a','b','c')#枚举,只能插入a、b、c三种,不分大小写
);
INSERT INTO tab_char VALUES('a');
INSERT INTO tab_char VALUES('b');
INSERT INTO tab_char VALUES('b');
INSERT INTO tab_char VALUES('m');
INSERT INTO tab_char VALUES('A');
SELECT * FROM tab_char;
#2.set集合
CREATE TABLE tab_set(
s1 SET('a','b','c','d')#多选字符串数据类型,适合存储预设的“多个值”,
);
INSERT INTO tab_set VALUES('a');
INSERT INTO tab_set VALUES('a,b');
INSERT INTO tab_set VALUES('a,c,d');
SELECT * FROM tab_set;
3、日期型
#3.
CREATE TABLE tab_date(
t1 DATETIME,
t2 TIMESTAMP #时间戳
);
INSERT INTO tab_date VALUES(NOW(),NOW());
SELECT * FROM tab_date;
SET time_zone = '+9:00';
SHOW VARIABLES LIKE 'time_zone';
二、常见约束
添加列级约束:
1、主键约束:primary key
它能够唯一确定一张表中的一条记录,也就是我们通过给某个子段添加约束,就可以使得该字段不重复,
特点:一张表最多一个主键,不允许为空null。
create table uesr(
id int primary key, (primary key:主键约束)
name varchar(20)
);
insert into uesr values(1,'张三');
insert into uesr values(1,'张三');
ERROR 1062 (23000): Duplicate entry ‘1’ for key 'PRIMARY’
——保证输入不会重复
insert into uesr values(2,'张三');
——用于唯一确定一条记录
对多个数据进行约束:——联合主键
create table user1(
id int,
name varchar(20),
password varchar(20),
primary key(id,name) (id和name都是主键)
);
insert int user1 values(1,'张三','123');
insert into user1 values(2,'张三','123');
如果忘记加主键约束,可以修改表结构,添加主键:
alter table user1 add primary key(id)
也支持删除主键约束:
alter table user1 drop primary key;
2、自增约束:auto_increment
结合主键约束一起使用primary key
create table user2(
id int primary key auto_increment,
name varchar(20)
);
insert into user2 (name) values('zhangsan');
insert into user2 (name) values('zhangsan');
select * from user2;
——管理加了自增约束的值,让它可以自动增长。
3、唯一约束:unique
——约束修饰的字段的值不可以重复
特点:一张表可以有多个唯一健,允许为空null。
create table user5(
id int,
name varchar(20)
);
添加约束方式一:add unique()
alter table user5 add unique(name);
desc user5;
insert into user5 value(1,'zhangsan');
insert into user5 value(2,'zhangsan');
ERROR 1062 (23000): Duplicate entry ‘zhangsan’ for key ‘name’——加了唯一约束的变量重复才会报错
添加约束方式二:在创建表时添加唯一约束
create table user5(
id int,
name varchar(20) unique
);
或者:
create table user5(
id int,
name varchar(20),
unique(id,name)
); #表示对id,name同时添加约束,要两个都重复才报错。
desc user6;
添加多个主键约束时,会显示MUL,表示多个。
添加约束方式三:modify
alter table user5 modify name varchar(20) unique;
删除唯一约束:
alter table user5 drop index name;
——唯一约束的标志不见了。
4、非空约束:not null
——not null所修饰的字段不能为空!
create table user8(
id int,
name varchar(20) not null
);
insert into user8 (id) values(1);
ERROR 1364 (HY000): Field ‘name’ doesn’t have a default value
——因为name加了非空约束,因为不能只给id传数据,而不给name传数据
insert into user8 values(1,'张三');
insert into user8 (name) values('李四');
——不给未加非空约束的变量传数据是可以的。
5、默认约束:default num
——当我们插入字段值的时候,如果没有传值,就会使用默认值。
create table user9(
id int,
name varchar(20),
age int default 10 #默认值是10
);
insert into user9 (id,name)values(1,'张三');
——只给前两个字段插入值
——会添加默认值
6、外键约束:foreign key
——涉及到两个表:主表、从表
【案例分析】
班级表:——主表
create table classes(
id int primary key,
name varchar(20)
);
学生表:——从表
create table students(
id int primary key,
name varchar(20),
class_id int,
foreign key(class_id) references classes(id)
);
desc classes;
desc students;
insert into classes values(1,'一班');
insert into classes values(2,'二班');
insert into classes values(3,'三班');
insert into classes values(4,'四班');
insert into students values(1005,'李四','5');#主表中id没有为5的
-ERROR 1452 (23000):
——主表(父表)classes中没有的数据,在从表(子表)中是不可以使用的。
delect from classes where id=4;
ERROR…
——如果主表中的记录被从表引用,是不可以被删除的。
【外键总结】:
(1)要求在从表设置外键关系;
(2)从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求;
(3)主表的关联列必须是一个key(一般是主键primary key或唯一键,,就是关联唯一不重复的)
主:id int primary key,
从:foreign key(class_id) references classes(id)
(4)插入数据时,先插入主表,再插入从表——主表classes中没有的数据,在从表中是不可以使用的;
(5)删除数据时,先删除从表,再删除主表——如果主表中的记录被从表引用,是不可以被删除的。
综合应用案例:
(1)添加列级约束
列级约束语法:直接在字段名和类型后面追加约束类型即可
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) #外键约束
#或者上一行references不写,这一行写:
#foreign key(majorID) reference major(id)
);
CREATE TABLE major(
id INT PRIMARY KEY,
majorName VARCHAR(20)
);
SHOW INDEX FROM stuinfo;#查看表中所有索引
(2)添加表级约束
DROP TABLE IF EXISTS stuinfo;#删了再建
CREATE TABLE stuinfo(
id INT,
stuName VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorID INT,
#表级约束
CONSTRAINT pk PRIMARY KEY(id),#主键约束,用CONSTRAINT来命名为pk
CONSTRAINT uq UNIQUE(seat),#唯一健
CONSTRAINT ck CHECK(gender='男' OR gender='女'),#检查约束
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorID) REFERENCES major(id) #外键约束
);
SHOW INDEX FROM stuinfo;#查看表中所有索引
(3)推荐的通用写法:
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,
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorID) REFERENCES major(id) #外键约束
);
【经典面试题】主键约束 和 唯一约束的对比
保证唯一性 是否允许为空 一个表中可以有多少个 是否允许组合
主键 √ × 至多1个 √,但不推荐
唯一 √ √,一列只能插一个null 可以有多个 √,但不推荐
组合主键:
CREATE TABLE stuinfo(
id INT,
stuName VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorID INT,
PRIMARY KEY(id,stuName),#添加组合主键
UNIQUE(seat),#唯一健
CHECK(gender='男' OR gender='女'),#检查约束
FOREIGN KEY(majorID) REFERENCES major(id) #外键约束
);
【外键特点】
1)要求在从表设置外键关系;
2)从表的外键列的类型和主表的关联列类型一致;
3)主表的关联列必须是一个key
4)插入数据时,先插入主表,再插入从表,删除数据时,先删除从表,再删除主表。
修改表时添加约束:ALTER
(1)列级约束
alter table 表名 modify column 字段名 字段类型 新约束;
(2)表级约束
alter table 表名 add 【constraint 约束名】 约束类型(字段名) 【外键的引用】;
CREATE TABLE major(
id INT PRIMARY KEY,
majorName VARCHAR(20)
);
#修改表时添加约束
CREATE TABLE stuinfo(
id INT,
stuName VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorID INT
);
#1、添加非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuName VARCHAR(20) NOT NULL;#列级约束
#2、添加非空约束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;#列级约束
#3、添加主键约束
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;#列级约束写法
ALTER TABLE stuinfo ADD PRIMARY KEY(id);#表级约束写法
#4、唯一键约束
ALTER TABLE stuinfo ADD UNIQUE(seat);
#5、外键约束
ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorID) REFERENCES major(id);#表级即可
DESC stuinfo;
修改表时删除约束:
#1、删除非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuName VARCHAR(20) NULL;
#2、删除默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT;
#3、删除主键约束
ALTER TABLE stuinfo MODIFY COLUMN id INT;
ALTER TABLE stuinfo DROP PRIMARY KEY;
#4、删除唯一约束
ALTER TABLE stuinfo DROP INDEX seat;
#5、删除外键约束
ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;
三、标识列(自增长列):auto_increment
——自增长列:可以不用手动地插入值,系统提供默认的序列值
#标识列
CREATE TABLE tab_identity(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
INSERT INTO tab_identity VALUE(NULL,'John');#自增长部分可以不用管
SELECT * FROM tab_identity;
插入语句执行几次,id就自增长几次:
也可以设置步长后再插入:
SET auto_increment_increment=3;#设置自增长步长为3
INSERT INTO tab_identity VALUE(NULL,'John');
SELECT * FROM tab_identity;
如果要设置起始值,设置第一个插入的值为起始值即可:——从10开始自增长
INSERT INTO tab_identity VALUE(10,'John');
INSERT INTO tab_identity VALUE(NULL,'John');
特点:
1、标识列必须和主键搭配吗?——不一定,但要求必须是一个key(主键、外键、唯一);
2、一个表中可以有几个标识列?——不可以,一个表至多一个自增长列;
3、标识列类型:只能是数值型(int 、float 、double )
4、标识列可以通过语句SET auto_increment_increment=3
设置步长,也可以通过手动插入设置起始值。
修改表时设置标识列:
ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT;
修改表时删除标识列:
ALTER TABLE tab_identity MODIFY COLUMN id INT;