列属性约束,保证表的结构和数据的正确性和稳定性。
总的来说有五种:唯一性和主键约束、外键约束、检查约束、空值约束、默认值约束。
五大关键词:UNIQUE和Primary Key, Foreign Key, CHECK, NOT NULL, DEFAULT
规定一个字段的值,是否可以是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;如果不可以,则不设置默认值。
注意:
可以在处理数据时,使用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;
默认值,在没有为该字段设置值是启用。
而且默认值的设置需要使用固定值。
常见场景
一个字段不能为空,而且存在默认值。
主键(PK,primary key)就是可以唯一标识某条记录的字段或者是字段的集合。
主关键字是表中的一个或多个字段,要求主键的值不能重复,只能有一个主键。
如果还存在不重复的记录,可以定义成唯一索引,提高检索效率。
主键不能为空,不设置或者null都会变成not null。
主键可以是真实实体的属性。
但是常用的好的解决方案是:
利用一个与实体信息不相关的属性,作为唯一标识。
主键与业务逻辑不发生关系。只用来标识记录。(自身保证不冲突,主键不属于当前实体的任何属性。)
设置主键的语法:通过primary key
完成
两种方案:
1、字段上设置
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
主键不能为空,也不能重复。一个字段是主键的话,自动设置不为空。
2、在定义完字段后,可以定义
通过这种方式可以定义多列主键。
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;
主键字段原则上在插入后,应该不被修改,但是语法上可以修改,但是修改的值不能与已有值冲突。
主键常见的设计:
每个表都应该存在一个可以唯一标识的主键字段,
最好与实体没有联系,不是实体属性字段。
为每条记录提供给一个唯一的标识。
每次插入记录时,将每个字段的值自动增加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=‘范冰冰‘;
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 classroom(
room_id int primary key auto_increment,
room_no char(3)
)engine myisam character set utf8;
myisam与innodb区别
1、保存文件的方式不同
myisam:一个表三个文件。tablename.frm
结构,tablename.myd
数据,tablename.myi
索引
innodb:一个表一个文件。tablename.frm
结构
所有的innodb表,都使用相同的innodb存储表空间在保存数据和索引。
2、Innodb很多时候是行级锁,而myisam是表级锁,innodb的并发高
3、MyIASM支持索引压缩,而Innodb索引和数据是绑定保存不压缩,体积大。
4、InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table
时,InnoDB要扫描一遍整个表来计算有多少行,
但是MyISAM只要简单的读出保存好的行数即可。
注意:当count(*)语句包含 where条件时,两种表的操作是一样的。
myisam适于插入,查找。
innodb适于更新,删除。
选择存储引擎的依据:
1、性能
2、功能
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/scgaliguodong123_/article/details/47205637