数据库外键约束

-- 1.1 默认值

CREATE TABLE student(

id INT,

NAME VARCHAR(20),

address VARCHAR(20) DEFAULT '广州天河'  -- 默认值

)

 

DROP TABLE student;

-- 当字段没有插入值的时候,mysql自动给该字段分配默认值

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

 

-- 注意:默认值的字段允许为null

INSERT INTO student(id,NAME,address) VALUE(2,'李四',NULL);

INSERT INTO student(id,NAME,address) VALUE(3,'王五','广州番禺');

 

 

-- 1.2 非空

 

-- 需求: gender字段必须有值(不为null

 

CREATE TABLE student(

 

id INT,

 

NAME VARCHAR(20),

 

gender VARCHAR(2) NOT NULL -- 非空

 

)

 

 

 

-- 非空字段必须赋值

 

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

 

-- 非空字符不能插入null

 

INSERT INTO student(id,NAME,gender) VALUES(1,'李四',NULL);

 

 

-- 1.3 唯一

 

CREATE TABLE student(

 

id INT UNIQUE, -- 唯一

 

NAME VARCHAR(20)

 

)

 

INSERT INTO student(id,NAME) VALUES(1,'zs');

 

INSERT INTO student(id,NAME) VALUES(1,'lisi'); -- ERROR 1062 (23000): Duplicate entry '1' for key 'id'

 

INSERT INTO student(id,NAME) VALUES(2,'lisi');

 

 

-- 1.4 主键(非空+唯一)

 

DROP TABLE student;

 

 

 

CREATE TABLE student(

 

id INT PRIMARY KEY, -- 主键

 

NAME VARCHAR(20)

 

)

 

 

 

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

 

INSERT INTO student(id,NAME) VALUES(2,'张三');

 

-- INSERT INTO student(id,NAME) VALUES(1,'李四'); -- 违反唯一约束: Duplicate entry '1' for key 'PRIMARY'

 

 

 

-- insert into student(name) value('李四'); -- 违反非空约束: ERROR 1048 (23000): Column 'id' cannot be null

 

 

 

-- 1.5 自增长

 

CREATE TABLE student(

 

id INT(4) ZEROFILL PRIMARY KEY AUTO_INCREMENT, -- 自增长,从0开始  ZEROFILL 零填充

 

NAME VARCHAR(20)

 

)

 

 

 

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

 

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

 

INSERT INTO student(NAME) VALUES('李四');

 

INSERT INTO student(NAME) VALUES('王五');

 

 

 

SELECT * FROM student;

 

-- 不能影响自增长约束

 

DELETE FROM student;

 

-- 可以影响自增长约束

 

TRUNCATE TABLE student;

 

 

 外键

作用:约束两种表的数据

出现两种表的情况:

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

例如: 员工表  和  部门表

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

 

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

-- 部门表(主表)

CREATE TABLE dept(

id INT PRIMARY KEY,

deptName VARCHAR(20)

)

 

-- 修改员工表(副表/从表)

CREATE TABLE employee(

id INT PRIMARY KEY,

empName VARCHAR(20),

deptId INT,-- 把部门名称改为部门ID

-- 声明一个外键约束

CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id)

--           外键名称                  外键               参考表(参考字段)

)

 

 

-- 部门表(主表)

CREATE TABLE dept(

id INT PRIMARY KEY,

deptName VARCHAR(20)

)

 

-- 修改员工表(副表/从表)

CREATE TABLE employee(

id INT PRIMARY KEY,

empName VARCHAR(20),

deptId INT,-- 把部门名称改为部门ID

-- 声明一个外键约束

CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id)

--           外键名称                  外键               参考表(参考字段)

)

 

 

级联操作

 

问题: 当有了外键约束的时候,必须先修改或删除副表中的所有关联数据,才能修改或删除主表!但是,我们希望直接修改或删除主表数据,从而影响副表数据。可以使用级联操作实现!!!

 

 

CREATE TABLE employee(

id INT PRIMARY KEY,

empName VARCHAR(20),

deptId INT,-- 把部门名称改为部门ID

-- 声明一个外键约束

CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE  -- ON CASCADE UPDATE :级联修改

--           外键名称                  外键               参考表(参考字段)

)

注意: 级联操作必须在外键基础上使用

-- 级联修改(修改)

-- 直接修改部门

UPDATE dept SET id=5 WHERE id=4;

 

-- 级联删除

-- 直接删除部门

DELETE FROM dept WHERE id=1;

 

posted @ 2017-10-23 20:00  _HelloWord  阅读(428)  评论(0编辑  收藏  举报