数据约束:对用户操作数据表的约束

1.默认值

作用:当用户对使用默认值的字段不插入值的时候,就使用默认值


create table student(
    id int,
    name varchar(20),
    address varchar(20)
)

insert into student (id,name) values(1,"cxspace");


不插入address,显示值为 NULL


drop table student

create table student(
    id int,
    name varchar(20),
    address varchar(20) default '阿富汗'  --默认值约束
)


当执行上面的insert的时候,mysql自动未为没有插入值的字段,插入default值


inset into student (id , NAME , address) values(1,'奥巴马',NULL)

//执行该语句,address字段值显示为null


注意:默认值字段允许为空!!!

2.非空


create table student( id int, name varchar(20), gender varchar(2) not null --非空约束 )


执行


insert into student( id , name) values (1,'haha');


一.报错,说明指定未非空的字段必须赋值


insert into student (id ,name , gender) values (2 , 'mike' , null);


二.报错,非空字段不能赋予null值

3.唯一


create table student(
   
       id int  unique,    ---唯一约束
       name varchar(20),
)


执行


insert into student (1,'tom');

insert into student (1,'jack');  //执行这个语句报错


违反唯一约束报错

执行


insert into student(name) values('jhon');


不报错,唯一可以不给值

如果在执行一次上面语句,包不报错???

不报错,唯一约束对NULL值不起作用

总结:唯一的字段可以插入null值,也可以插入多个null值

4.主键(非空+唯一)


create table student (
    id int primary key, --主键
    name varchar(20) 
)


执行下面语句


insert into student(name) values ('lisi');


报错===违反非空约束

执行下面语句


insert into student (1,'tom');

insert into student (1,'jack');  //执行这个语句报错


报错===违反唯一约束

通常情况下

1===每张表都会设置一个主键字段,用以标记表中每条字段的唯一性.

2===建议不要选取包含业务含义的字段作为主键,给每张表设计一个非业务含义的id字段.

 

5.自增长

作用:自动的递增


create table student (
    id int(4) zerofill primary key auto_increment, --主键
    name varchar(20) 
)


插入数据


insert into student(name) values('张三');


自增长的字段可以不赋值,自动赋值


insert into student(name) values('里斯');  //id为2


====主键为int时,一般加入自增长=====

zerofill会在数值前面自动补0

0001  0002 0003 ...

========================关于影响自增长约束的问题==========================

delete from student    ----> 不能影响自增长约束

truncate table student   ---->   会影响自增长约束

 

6.外键

例子


create table employee(
    id int primary key,
    empName varchar(20),
    deptName  varchar(20)  --部门名称
)


插入值


insert into employee values(1,'tom','开发部');
insert into employee values(2,'jhon','销售部');
insert into employee values(3,'jack','应维部');


---添加员工


//添加员工,部门名称数据冗余高
insert into employee values(4,'mike',"开发部");


---------如何解决数据冗余问题

 

===========解决之道=========================================================================================================

把冗余字段放到一张独立的表中

 

设计独立的部门表


create table dept(
   id int primary key,
   deptName varchar(20)
)


插入部门数据


inset into dept(id,deptName) values(1,'开发部');
inser into dept(id,deptName) values(2,'销售部');


=========修改员工表=========================================================================================================


create table employee(
    id int primary key,
    empName varchar(20),
    deptId  int  --部门名称
)


插入数据


insert into employee values(1,'tom',1);
insert into employee values(2,'jhon',1);
insert into employee values(1,'mike',2);


 

========================问题


insert into (4,'tiny',4);   //不报错,插入的这条记录不合法,插入了不存在的部门数据


====如何解决

===在员工表中添加外键约束


create table employee(
    id int primary key,
    empName varchar(20),
    deptId  int , --部门名称
    
    CONSTRAINT  employee_dept_fk  FOREIGN KEY(deptId) references dept(id)       
                       外键名称                  外键                 参考表(参考字段)                
)


执行下面语句


insert into (4,'tiny',4);


违反外键约束,报错

外键总结

作用:约束两种表的数据

出现两种表的情况:

解决数据冗余高的问题,独立出一张表

例如上面的  员工表  和   部门表

问题:在插入员工表数据的时候,员工表的部门ID字段可以随便插入!!!

使用外键约束,约束插入员工表的部门ID字段值

解决办法:在员工表的部门ID字段添加一个外键约束

 

1)把员工表叫做“副表”(被约束的表),部门表叫“主表”(被约束的表)

2)主表的参考字段通常为主键!

3)添加数据:先添加主表,再添加副表

4)修改数据:先改副表,后改主表

5)删除数据:先删副表,后删主表

 

==级联操作==

===========当有了外键约束的时候,必须先修改或删除副表中的所有关联数据,才能修改或删除主表!但是,我们希望直接

修改或删除主表数据,从而影响副表数据。


create table employee(
    id int primary key,
    empName varchar(20),
    deptId  int , --部门名称
    
    CONSTRAINT  employee_dept_fk  FOREIGN KEY(deptId) references dept(id)              ON UPDATE CASCADE    ON DELETE CASCADE 
                       外键名称                  外键                 参考表(参考字段)        级联修改             级联删除
)


执行下面语句


update dept set id = 5 where id = 4;


不会报错

副表里面的id会全部改,和主表一样


DELETE FROM dept where id = 1;


级联修改:ON UPDATE CASCADE

级联删除:ON DELETE  CASCADE