mysql数据库的八种数据约束

-- 数据约束网络


-- 1)not null(非空约束)
-- 用来约束字段,表示这个字段不能为null
-- 建立student表
CREATE TABLE student(id INT,NAME VARCHAR(10) NOT NULL,age INT);
-- 插入数据
INSERT INTO student VALUES (1,'张三',18);
INSERT INTO student VALUES (2,NULL,19);-- 错误
-- 注意:非空约束不能约束空字符串''
INSERT INTO student VALUES (3,'',20);-- 正确
SELECT * FROM student;rem

-- 2)unique(惟一约束)
CREATE TABLE student(id INT UNIQUE,NAME VARCHAR(10),age INT);
-- 插入数据
INSERT INTO student VALUES (1,'张三',18);
-- 注意:添加了惟一约束的字段的数据不能重复
INSERT INTO student VALUES (1,'李四',19);-- 错误
INSERT INTO student VALUES (NULL,'王五',20);-- 正确
-- 注意:惟一约束不能约束null
INSERT INTO student VALUES (NULL,'小明',20);-- 正确字符串

-- 3)primary key(主键约束=非空+惟一)
-- 注意:给字段添加主键后
-- 该字段的数据不能为null,也不能重复
CREATE TABLE student (
id INT PRIMARY KEY,
NAME VARCHAR(10),
age INT
);class

-- 插入数据
INSERT INTO student VALUES(1,'张三',18);
-- 注意:主键字段数据不能重复
INSERT INTO student VALUES(1,'李四',19);-- 错误
-- 注意:主键字段不能为null
INSERT INTO student VALUES(NULL,'王五',20);-- 错误
-- 查询数据
SELECT * FROM student;软件

-- 4)默认值(default)
CREATE TABLE student(
id INT,
NAME VARCHAR(10),
sex VARCHAR(1) DEFAULT '男'
);
-- 插入数据
INSERT INTO student (id,NAME) VALUES (1,'张三');
INSERT INTO student VALUES (2,'李四','女');
INSERT INTO student VALUES (3,'王五','男');
SELECT * FROM student;date

-- 5)建立表约束(if not exists)
-- 当表不存在的时候才会建立表
-- 若是表已经存在了就不会再建立
CREATE TABLE IF NOT EXISTS student(
id INT,
NAME VARCHAR(10)
);
DROP TABLE student;软件工程

-- 6)自增加(auto_increment)
-- 自增加的初始值为0,每次添加一条数据+1
-- 注意:必须是主键才能使用自增加约束
CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10)
);
-- 插入数据
INSERT INTO student (NAME) VALUES('张三');
INSERT INTO student (NAME) VALUES('李四');
INSERT INTO student (NAME) VALUES('王五');
INSERT INTO student (NAME) VALUES('小明');
SELECT * FROM student;
-- 使用delete删除数据不会重置自增加的值
DELETE FROM student WHERE id=3;
-- 使用truncate删除数据会重置自增加的值
-- 注意:不须要写from
TRUNCATE student;
-- 注意:truncate删除数据不能跟where条件
TRUNCATE student WHERE id = 1;-- 错误
-- delete和truncate的区别
-- 1)delete后面能够使用where条件删除数据,truncate不能够
-- 2)delete删除数据不会重置自增加的值,
--   truncate删除数据会重置自增加的值
-- 3)delete删除数据后能够经过回滚恢复数据。
--  truncate删除数据是直接从硬盘上删除,不能够恢复。im

DROP TABLE student;数据

-- 7)外键约束(foreign key)
-- 建立学生表(student表)
-- 给学生表添加外键约束:约束classid字段参照class表的id字段
-- 外键约束约束了学生表的classid字段数据必须
-- 要在class表的id字段存在,不然报错。
-- 参照的字段必需要为主键字段
-- 副表(student表):添加外键约束的表就称做副表
-- 主表(class表):参照的表就是主表
CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
classid VARCHAR(10),
-- 给classid字段添加外键约束
CONSTRAINT fk_sc FOREIGN KEY(classid) REFERENCES class(id)
--       外键名称(自定义)    外键字段   参照     参照表(参照字段)
);
-- 建立班级表(class表)
CREATE TABLE class(id VARCHAR(10) PRIMARY KEY,NAME VARCHAR(20));
-- 插入班级数据
INSERT INTO class VALUES('c1','软件工程');
INSERT INTO class VALUES('c2','网络工程');
INSERT INTO class VALUES('c3','电子商务');
SELECT * FROM class;
DELETE FROM class;
-- 录入学生数据
INSERT INTO student VALUES(1,'张三','c1');
INSERT INTO student VALUES(2,'李四','c2');
-- 外键约束错误,classid在class表的id字段不存在这个数据
INSERT INTO student VALUES(3,'王五','c3');
INSERT INTO student VALUES(4,'陈六','c1');
INSERT INTO student VALUES(5,'小明','c1');
INSERT INTO student VALUES(6,'张无忌','c2');
INSERT INTO student VALUES(7,'马七',NULL);
SELECT * FROM student;查询

-- 8)级联约束(on update cascade/on update cascade)
-- 修改主表里的id字段数据
-- 问题:student表添加classid外键参照class表的id字段,id字段不能修改
-- 若是想要修改,须要将主表和副表里的数据一块儿修改
-- 解决:添加级联修改约束,当修改主表数据时,副表数据会被一块儿修改
UPDATE class SET id='c6' WHERE id='c1';
DELETE FROM class WHERE id='c6';

-- 添加级联约束 CREATE TABLE student( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10), classid VARCHAR(10), -- 给classid字段添加外键约束 CONSTRAINT fk_sc FOREIGN KEY(classid) REFERENCES class(id)  --       外键名称(自定义)    外键字段   参照     参照表(参照字段)     ON UPDATE CASCADE  ON DELETE CASCADE --  级联修改约束        级联删除约束 );