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