列属性约束,保证表的结构和数据的正确性和稳定性。mysql
总的来讲有五种:惟一性和主键约束、外键约束、检查约束、空值约束、默认值约束。
五大关键词:UNIQUE和Primary Key, Foreign Key, CHECK, NOT NULL, DEFAULT sql
规定一个字段的值,是否能够是null。 null(默认) 或 not null
Null表示没有值。与任何数据不一样。表示什么都没有。
若是一个列不容许为空,可是在赋值时,没有为该字段赋值,则会出现问题。
Mysql的每条记录,若是存在能够为null的字段,则须要使用一个字节保存哪些字段是空。服务器
create table one( a int not null, b int );
insert into one (a) values(10);
select * from one;
使用default value
来声明
DEFAULT子句用于为列指定一个默认,当该字段不存在值时,会被启用。
默认值必须为一个常数,不能为一个函数或一个表达式。
能够不存在default,可是mysql会判断:
若是该列能够为空,则默认值为null;若是不能够,则不设置默认值。markdown
注意:
能够在处理数据时,使用default,显示地使用默认值。
有些列是不能有默认值的:Blob,text。
时间戳类型,能够设置一个特殊的默认值 CURRENT_TIMESTAMP。在当列不存在或者传递的值为null时,使用当前的时间戳。并发
drop table two;
create table two( a int not null default 10, b int not null default 20, c int default 30, d int );
insert into two(a) values(10);
insert into two(b) values(10);
select * from two;
默认值,在没有为该字段设置值是启用。
并且默认值的设置须要使用固定值。ide
常见场景
一个字段不能为空,并且存在默认值。函数
主键(PK,primary key)就是能够惟一标识某条记录的字段或者是字段的集合。
主关键字是表中的一个或多个字段,要求主键的值不能重复,只能有一个主键。
若是还存在不重复的记录,能够定义成惟一索引,提升检索效率。
主键不能为空,不设置或者null都会变成not null。性能
主键能够是真实实体的属性。
可是经常使用的好的解决方案是:
利用一个与实体信息不相关的属性,做为惟一标识。
主键与业务逻辑不发生关系。只用来标识记录。(自身保证不冲突,主键不属于当前实体的任何属性。)编码
设置主键的语法:经过primary key
完成
两种方案:
一、字段上设置atom
drop table teacher;
create table teacher( t_id int primary key, t_name varchar(10), classname varchar(6), days tinyint unsigned )character set gbk;
insert into teacher values(1,'周杰伦','0324',32);
insert into teacher values(-1,'刘德华','0334',35);
show create table teacher\G
主键不能为空,也不能重复。一个字段是主键的话,自动设置不为空。
二、在定义完字段后,能够定义
经过这种方式能够定义多列主键。
create table teacher( t_id int, t_name varchar(10), classname varchar(6), days tinyint unsigned, primary key (t_id) );
组合主键
drop table teacher;
create table teacher( t_name varchar(10), classname varchar(6), days tinyint unsigned, primary key (t_name,classname) );
注意:
组合主键表示一个主键内包括多个字段,而不是多个字段都是主键;只须要一个惟一标识便可,mysql规定只能存在一个主键。
经过修改表来删除主键 alter table tbl_name drop primary key;
经过修改表来增长主键Alter table tb add primary key(id);
主键字段原则上在插入后,应该不被修改,可是语法上能够修改,可是修改的值不能与已有值冲突。
主键常见的设计:
每一个表都应该存在一个能够惟一标识的主键字段,
最好与实体没有联系,不是实体属性字段。
为每条记录提供给一个惟一的标识。
每次插入记录时,将每一个字段的值自动增长1。
使用auto_increment
标识。
须要整型,还须要有索引。
一般自动增加是从1开始递增,可是能够经过修改表属性,更改初始值。
表属性 auto_increment=x
;(若是比已存在的小,则会从已有的最大值新记录)
drop table teacher;
create table teacher( t_id int primary key auto_increment, t_name varchar(10), classname varchar(6), days tinyint unsigned );
insert into teacher values(null,'周杰伦','0324',32);
insert into teacher values(null,'刘德华','0334',35);
insert into teacher (t_name,classname,days)values('周韦彤','0324',31);
select * from teacher;
自动增加的初始值:是能够设置的,默认是1。
经过表的选项:auto_increment n
alter table teacher auto_increment 10;
select * from teacher;
insert into teacher values(null,'范冰冰','0334',35);
select * from teacher;
自动增加是否能够手动插入该列的值?
仍然能够手动插入。
若是是主键的话,该列不能重复,不然,能够重复。
insert into teacher values(7,’范冰冰’,’0334’,35);
自动增加该列是否能够更新?
能够
update teacher set t_id=100 where t_name='范冰冰';
delete from teacher where t_name='范冰冰';
如何删除自增加的主键id?
先删除自增加,在删除主键。
Alter table tb change id id int(10);//删除自增加
Alter table tb drop primary key;//删除主建
Alter table test change id id int;//删除自增加
Alter table test drop primary key;//删除主键
insert into test values(6,'mark',5);
1:1 一对一
两个实体表内,存在相同的主键字段。
若是记录的主机值等于另外一个关系表内的记录的主机主键值,则两条记录一一对应。
1:n 一对多
一个实体,对应多个其余实体
例如:一个班级对应多个学生
设计:
在多的那端,增长一个字段,
用于指向该实体所属的另外的实体的惟一标识,即主键。
m:n 多对多
设计:
典型的是利用一个中间表,表示实体之间的关系。
中间表的每一个记录,表示一个关系。
一个M:N能够经过1:M,1:N来实现。
若是一个实体(student)的某个字段(class_id),指向(引用)另外一个实体(class)的主键(class_id),就称student实体的class_id是外键。
被指向的实体(class),称之为主实体,也叫(父实体)。
负责指向的实体,称之为从实体(从表),也叫子实体(子表)。
做用:
用于约束处于关系内的实体。
须要解决的问题?
增长子表记录时,是否有与之对应的父表记录。
在删除或者更新主表记录时,从表应该如何处理相关的记录。
如何定义一个外键?
在从表上,增长一个字段,指向主表的主键。
使用关键字 foreign key
drop table if exists class;
create table class( class_id int primary key auto_increment, class_name varchar(20) not null default 'deeplearning' comment '班级名称' )character set utf8;
set names gbk;
客户端与服务器端通讯的编码 character set utf8
这里的utf8是数据存储到服务器的编码。
drop table if exists student;
create table student( stu_id int primary key auto_increment, stu_name varchar(10) not null default '', class_id int, foreign key (class_id) references class(class_id) )character set utf8;
必须主表里面先有数据,才能在从表中插入数据。
insert into class values (null,'c program design');
insert into student values (null,'张三丰',1);
设置级联操做
在主表数据发生改变时,与之关联的从表数据应该如何处理。
主表更新,主表删除时:使用关键字on update
,on delete
来标识。
容许的级联动做:
cascade关联操做,若是主表被更新或删除,那么从表也会执行相应的操做。
set null,设置null,表示从表不指向任何主表记录。
restrict,拒绝主表的相关操做。
修改外键:
先删除,再新建,经过修改表完成。 alter table table_name drop foreign key(class_id);
删除外键须要用指定外键名称达到目的,能够经过在建立外键时指定名称
或者使用mysql默认生成的名称。 show create table student\G
alter table student drop foreign key student_ibfk_1;
增长外键,设置删除时将从表的数据设置为null alter table table_name add foreign key(外键);
alter table student add foreign key (class_id) references class(class_id) on delete set null;
show create table student\G select * from class;
select * from student;
delete from class where class_id=2;
select * from class;
select * from student;
on delete
增长外键,设置删除时将从表的数据同时也删除。
insert into class values (1,'c program design');
update student set class_id=1 where stu_id = 1;
alter table student drop foreign key student_ibfk_1;
alter table student add foreign key (class_id) references class(class_id) on delete cascade;
select * from class;
select * from student;
delete from class where class_id=1;
select * from class;
select * from student;
on update
指的是只有主表的主键发生变化,才会对从表产生影响。
insert into class values (1,'c program design');
insert into student values (1,'张三丰',1);
select * from class;
select * from student;
alter table student drop foreign key student_ibfk_1;
alter table student add foreign key (class_id) references class(class_id) on delete cascade on update restrict;
update class set class_id=2 where class_id=1;
不能操做成功
更新存在关联的主表数据的主键字段
alter table student drop foreign key student_ibfk_1;
alter table student add foreign key (class_id) references class(class_id) on delete cascade on update cascade;
默认的服务器表类型,经过my.ini能够配置。 default-storage-engine=INNODB
在建立表或编辑表时,能够指定表的存储引擎。
利用表属性:engine 引擎类型
。
经过engine myisam
,engine innodb
在建立时指定。
alter table class engine myisam; 不能操做成功,有外键。
注意:外键只被innodb存储引擎所支持。其余引擎是不支持的。
create table cla***oom( room_id int primary key auto_increment, room_no char(3) )engine myisam character set utf8;
myisam与innodb区别
一、保存文件的方式不一样
myisam:一个表三个文件。tablename.frm
结构,tablename.myd
数据,tablename.myi
索引
innodb:一个表一个文件。tablename.frm
结构
全部的innodb表,都使用相同的innodb存储表空间在保存数据和索引。
二、Innodb不少时候是行级锁,而myisam是表级锁,innodb的并发高
三、MyIASM支持索引压缩,而Innodb索引和数据是绑定保存不压缩,体积大。
四、InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table
时,InnoDB要扫描一遍整个表来计算有多少行,
可是MyISAM只要简单的读出保存好的行数便可。
注意:当count(*)语句包含 where条件时,两种表的操做是同样的。
myisam适于插入,查找。
innodb适于更新,删除。
选择存储引擎的依据: 一、性能 二、功能