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;

-- 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
);

-- 插入数据
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;

-- 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删除数据是直接从硬盘上删除,不可以恢复。

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
--  级联修改约束        级联删除约束
);

猜你喜欢

转载自blog.csdn.net/qq_42239765/article/details/82530070