您当前的位置: 首页 >  sql

星夜孤帆

暂无认证

  • 4浏览

    0关注

    626博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

MySQL学习笔记(3)-列属性与实体关系

星夜孤帆 发布时间:2018-06-03 00:27:00 ,浏览量:4

create table java1(
a int not null,
b int 
);
insert into java1(a) values(10);
insert into java1(b) values(11);  没有a,并且没有可以使用的值,不能插入成功

是否为空:

规定一个字段的值,是否可以是 null 

Null | not nll

默认值属性:

Default value 来声明

默认值,在没有为该字段设置值时启用,而且默认值的设置需要使用固定值。

常见的是:一个字段不能为空,而且存在默认值。

create table java2(
a int not null default 10,
b int not null default 20
);
insert into java2(a) values (10);
insert into java2(b) values (11);
select * from java2;
create table java3(
a int  not null default 10,
b int default 21
);
insert into java3 values (20 null);
select * from java3;

主键:PK ,primary key

可以唯一标识,某条记录的字段或者是字段的集合,就是主键。

主键可以是真实实体的属性,但是常用的好的解决方案是:

利用一个与实体信息不相关的属性,作为唯一标识。主键与业务逻辑不发生关系,只用来标识记录。

设置主键的语法:

Primary key完成。

两种方案:

1,字段上设置:

主键字段在插入时不能为空,或者冲突;

讲师班级天数id hanA0331251 li0228222 hanA0228243 liB0228254 
create table teacher(
t_id int primary key,
t_name varchar(5),
class_name varchar(6),
days tinyint unsigned
);
insert into teacher values(1,'hanA','0331',25); 类型规定,若为负,也可以-1
insert into teacher values(1,'liA','0228',22);  冲突
insert into teacher values(null,'liA','0228',22); 主键自动设置为不能为空

可以利用主键迅速进行定位

select * from teacher where t_id=1;

2.在定义完字段后,可以定义:

可以定义多列主键(组合主键)

注意:组合主键的意义:

一个主键内包括多个字段,而不是多个字段都是主键。

只需要一个唯一标识即可。mysql规定只能存在一个主键。

要求:

常见的设计,每个表都应该存在一个可以唯一标识的主键字段。最好与实体没有联系,不是实体属性字段。

create table teacher2(
t_name varchar(5),
class_name varchar(6),
days tinyint unsigned,
primary key(t_name,class_name)
);
desc teacher2;

自动增长

为每条记录提供一个唯一的标识。

每次插入记录时,将某个字段的值自动增加1;使用auto——increment标识。

需要整型,还需要有索引。

插入数据时,可以选择插入null,或者不插入

create table teacher3(
t_id int primary key auto_increment,
t_name varchar(5),
class_name varchar(6),
days tinyint unsigned
);
insert into teacher3 values(null,'hanB','0228',34);
insert into teacher3 (t_name, class_name,days) values('hanB','0228',34);

自动增长的初始值,是可以设置的,默认是1,通过表的选项:auto_increment=n

alter teacher3 auto_increment 5;
insert into teacher3 values(null,'zhaoA','0115',34);

alter teacher3 auto_increment 5;    n的值,小于已经存在主键的值。
insert into teacher3 values(null,'zhaoA','0115',34);

是否可以手动插入该列的值?可以,但是如果是主键的话,不能重复。

insert into teacher3 values(5,'zhaoA','0115',31);
select * from teacher3;

该列是否可以更新?

可以,主键不可以冲突

update teacher3 set t_id=21 where t_name='zhaoA';

实体之间的关系

(1)1:1

设计:

两个实体表内,存在相同的主键字段。

如果记录的主键值等于另一个关系表内记录的主键值,则两条记录对应1:1对应。

(2)1:n一对多

一个实体,对应多个其他实体,例如一个班级对应多个学生。

设计:

在多的那端,增加一个字段,用于指向该实体所属的另外的实体的标识。

(3)M:N多对多:

设计:

典型的,利用一个中间表表示实体之间的对应关系。

中间表的每个记录,表示一个关系。

可以分析:

一个M:N

1:M

1:N来实现

外键foreign key

drop table if exists itcast_class;
create table itcast_class(
class_id int primary key auto_increment,
class_name varchar(10) not null default 'itcast_php' comment '班级名称'
) character set utf8;
drop table if exists itcast_student;
create table itcast_student(
stu_id int primary key auto_increment,
stu_name varchar(10) not null default '',
class_id int,
foreign key (class_id) references itcast_class (class_id)
) character set utf8;

概念:

如果一个实体的(student)的某个字段(student:class_id),指向(引用)另一个实体(class)的主键(class:class_id),就成student实体的class_id是外键。

被指向的实体,称之为主实体(主表),也叫父实体(父表)。class

负责指向的实体,称之为从实体(从表),也叫子实体(子表)。student

作用:

用于约束处于关系内的实体。增加子表记录时,是否有与之对应的父表记录。

在删除或者更新主表记录时,从表应该如何处理相关的记录。

定义一个外键:

在从表上,增加一个外键字段,指向主表的主键。使用关键字foreign key

Foreign Key(外键字段) references 主表名(关联字段)【主表记录删除时的动作】【主表记录更新时的动作】

insert into itcast_student values(null,'张三丰',1);
insert into itcast_class values(null,'php0331');
insert into itcast_student values(null,'张三丰',1);
select * from itcast_student\G

设置级联操作:

在主表数据发生改变时,与之关联的从表数据应该如何处理:

主表更新:

主表删除:

使用关键字:

On update

On delete来标识。

允许的级联动作:

Cascade:关联操作,如果主表被更新或删除,那么从表也会执行相应的操作。

Set null:设置为null,表示从表不指向任何主表记录。

Restrict:拒绝主表的相关操作。

修改这个外键:

先删除,在新建。通过修改表完成。

show create table itcast_student;

alter table tbl_name drop foreign key(class_id);
删除外键需要通过指定外键名称达到目的:
可以通过在创建外键时,指定名称,或者使用mysql默认生成的名称
alter table tbl_name add foreign key 外键定义
alter table itcast_student drop foreign key itcast_studnet_ibfk_1;    执行完之后外键被删除
show create table itcast_student\G;

set null :设置为null,表示从表不指向任何主表记录。

alter table itcast_student add foreign key (class_id) references itcast_class (class_id) on delete set null; 删除时,将从表外键,设置为null

delete from itcast_class where class_id=1;

删除主表class_id=1主表为空,从表id被设置为null

Cascade:关联操作,如果主表被更新或删除,那么从表也会执行相应的操作。

insert into itcast_class values(1,'php0331');
update itcast_student set class_id=1 where stu_id=2;
alter table itcast_student drop foreign key itcast_student_ibfk_1;
alter table itcast_student add foreign key (class_id) references itcast_class (class_id) on delete cascade;
delete from itcast_class where class_id=1;
On update指的是只有主表的主键发生变化,才会对从表产生影响。
insert into itcast_class values(1,'php0331');
insert into itcast_student values(null,'张三丰',1);
alter table  itcast_student drop foreign key itcast_student_ibfk_1;
alter table itcast_student add foreign key (class_id) references itcast_class (class_id)
on delete cascade
on update restrict;
update itcast_class set class_id=2 where class_name = 'php0331';

更新存在关联的主表数据的主键字段:

关注
打赏
1636984416
查看更多评论
立即登录/注册

微信扫码登录

0.0393s