mysql_约束

-- 1.默认值: DEFAULT

-- 对默认值字段可以插入null

CREATE TABLE stu(

id INT,

NAME  VARCHAR(20),

address VARCHAR(20) DEFAULT '北京'

);

 

SELECT  * FROM  stu;

 

INSERT  INTO  stu  (id,NAME,address) VALUES(1,'张三','河南');

INSERT  INTO  stu(id,NAME) VALUES(2,'李四');

INSERT  INTO  stu (id,NAME,address) VALUES(3,'王五','');

 

-- 2.非空:NOT  NULL

-- 限制字段必须赋值

 

CREATE TABLE stu1(

id INT,

NAME VARCHAR(20),

num  VARCHAR(20)  NOT  NULL

);

 

SELECT * FROM stu1;

 

INSERT  INTO stu1 (id,NAME,num)  VALUES(1,'张三','11');

-- 非空字段不能插入null

INSERT  INTO  stu1(id,NAME,num) VALUES(2,'李四','22');

 

-- 3.唯一性:UNIQUE 对当前的字段不能进行重复

-- 唯一性 可以允许插入null值,并且允许插入多个null

 

CREATE  TABLE stu2(

id  INT,

NAME VARCHAR(20),

num VARCHAR(20)  UNIQUE

);

 

SELECT  * FROM  stu2;

INSERT  INTO  stu2(id,NAME,num)  VALUES(1,'张三','111');

INSERT  INTO  stu2(id,NAME,num)  VALUES(2,'李四','111');-- 出错:Duplicate entry '111' for key 'num'

 

INSERT  INTO  stu2(id,NAME,num) VALUES(3,'王一',NULL);

INSERT  INTO  stu2(id,NAME,num) VALUES(4,'王二',NULL);

 

-- 4.主键PRIMARY  KEY ,满足唯一性+非空两个条件

-- 一般情况下 每张表 都会设置一个主键字段 用于标记表中的每条记录都是唯一性

-- 建议不要选择表的包含业务含义的字段作为在主键,建议给每张表都独立的设计一个非业务含义的字段,如id字段当做主键

CREATE  TABLE  stu3(

 id  INT NOT NULL UNIQUE,

 NAME VARCHAR(20)

);

 

SELECT * FROM stu3;

INSERT  INTO stu3(id,NAME) VALUES(1,'张三');

INSERT  INTO  stu3(id,NAME) VALUES(NULL,'李四');-- 出错:id不能为空

 

CREATE TABLE  stu4(

id  INT PRIMARY  KEY,

NAME  VARCHAR(10)

);

 

SELECT * FROM  stu4;

INSERT  INTO  stu4(id,NAME) VALUES(1,'张三');

-- 主键可以是空字符,但是也要唯一

INSERT  INTO stu4(id,NAME) VALUES('','李四');

INSERT  INTO stu4(id,NAME) VALUES('','李四');

 

-- 5.自增长:AUTO_INCREMENT

--  自动的递增

CREATE TABLE stu5(

-- id自动增长,有4位数

id INT(4) ZEROFILL  PRIMARY KEY AUTO_INCREMENT ,

NAME VARCHAR(20)

);

 

INSERT  INTO  stu5(NAME)  VALUES('张三');

SELECT * FROM  stu5;

 

DELETE FROM stu5;-- 只能删除数据不能删除约束

TRUNCATE TABLE  stu5;-- 删除约束 也可以删除数据

 

-- 6.外键

-- 什么时候使用外键:

-- 出现两张表的时候并且数据冗余比较高,然后把数据冗余比较高的,单独作为一张表

 

-- 创建主表:约束别人的表被称为主表

CREATE  TABLE dept(

id  INT  PRIMARY KEY,

deptname VARCHAR(20)

);

INSERT  INTO  dept(id,deptname) VALUES(1,'开发部');

INSERT  INTO dept(id,deptname) VALUES(2,'秘书部');

SELECT * FROM  dept;

 

-- 创建副表:被约束的表被称为副表 外键设置在副表上面

CREATE  TABLE emp(

id  INT PRIMARY KEY,

empname  VARCHAR(20),

deptid INT,

-- 定义外键约束

CONSTRAINT emp_dept_fk  FOREIGN KEY (deptid) REFERENCES dept(id)

         --  外键名                  外键                 -- 关联表(参考字段)

);

SELECT * FROM  emp;

INSERT  INTO emp(id,empname,deptid) VALUES(1,'张三',1);

-- deptid是外键,主表中没有id5的,所以没法插入

INSERT  INTO emp(id,empname,deptid) VALUES(2,'李四',5);

 

-- 添加几条数据便于操作

INSERT  INTO dept(id,deptname) VALUES(3,'总经办');

INSERT  INTO dept(id,deptname) VALUES(4,'财务部');

INSERT  INTO emp(id,empname,deptid) VALUES(2,'张三',2);

INSERT  INTO emp(id,empname,deptid) VALUES(3,'李四',3);

INSERT  INTO emp(id,empname,deptid) VALUES(4,'王五',4);

 

-- 删除部门编号为id=1的部门信息

-- 不能直接进行删除部门信息   1.先删除副表当中的数据 在删除主表当中数据

SELECT * FROM emp;

DELETE  FROM emp  WHERE deptid=1;

DELETE FROM dept  WHERE id=1;

SELECT * FROM  dept;

-- 添加的时候  先添加主表再添加副表

-- 修改  把部门编号为2的部门信息修改为  开发部

UPDATE dept SET deptname='开发部' WHERE  id=2;

-- 修改  把部门编号为2的部门编号修改为8

UPDATE dept  SET  id=8 WHERE id=2;

-- 修改员工信息  把部门编号为2的下的所有的员工修改为其他部门去  然后在修改部

-- 门编号  在然后 把原来的员工信息修改回来

UPDATE  emp SET  deptid=4  WHERE deptid=2;

UPDATE dept  SET  id=8 WHERE id=2;

UPDATE  emp  SET  deptid=8 WHERE deptid=4;

-- 7.级联操作:当有了外键约束的时候,我们不能直接删除或者是修改主表当中的内容

-- 但是多数情况下 我们需要直接进行操作主表当中的数据从而要影响副表当中数据

-- 那么这个时候就需要使用级联操作

SELECT * FROM dept;

 

CREATE  TABLE emppp(

id INT PRIMARY KEY,

NAME  VARCHAR(20),

deptid INT,

CONSTRAINT emppp_dept_fk FOREIGN KEY(deptid)  REFERENCES dept(id) ON UPDATE CASCADE  ON DELETE  CASCADE

);

 

SELECT * FROM  emppp;

INSERT  INTO  emppp(id,NAME,deptid) VALUES(1,'李四',8);

UPDATE  dept  SET id=2  WHERE  id=8;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值