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 liB0228254create 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';
更新存在关联的主表数据的主键字段: