篮球世界杯篮彩


魏拯民任东满省委书记、东北抗日联军第2军政治委员

‘你不买丝袜去学校

唯一性和主键约束、外键约束、检查约束、空值约束、默认值约束

MySQL列属性约束及存储引擎

列属性约束,保证表的结构和数据的正确性和稳定性。

总的来说有五种:唯一性和主键约束、外键约束、检查约束、空值约束、默认值约束。
五大关键词:UNIQUE和Primary Key, Foreign Key, CHECK, NOT NULL, DEFAULT
图片 1

是否为空

规定一个字段的值,是否可以是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;

默认值,在没有为该字段设置值是启用。 而且默认值的设置需要使用固定值。<
喎?http://www.Bkjia.com/kf/ware/vc/” target=”_blank”
class=”keylink”>vcD4NCjxwPjxjb2RlIGNsYXNzPQ==”hljs
sql”>常见场景 一个字段不能为空,而且存在默认值。

主键约束

主键(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://www.bkjia.com/Mysql/1042777.htmlwww.bkjia.comtruehttp://www.bkjia.com/Mysql/1042777.htmlTechArticleMySQL列属性约束及存储引擎
列属性约束,保证表的结构和数据的正确性和稳定性。
总的来说有五种:唯一性和主键约束、外键约束、检查约…

相关文章

No Comments, Be The First!
近期评论
    功能
    网站地图xml地图