数据库-数据约束
对用户操作表的数据进行约束
CREATE TABLE sclass(
cid INT,
cname VARCHAR(20),
adress VARCHAR(20)DEFAULT '东南角'
);
-- 默认值约束(缺省约束)
作用:当用户对使用默认值的字段不插入值的时候,就使用默认值
注意:
1.对默认值字段插入null是可以的
2.对默认值字段可以插入非null
INSERT INTO sclass VALUES(1,'太阳班','西北角')
INSERT INTO sclass(cid,cname) VALUES(2,'小草班')
INSERT INTO sclass VALUES(3,'小花班',NULL)
-- 非空约束
注意:
1.非空字段必须赋值
2.非空字段不能赋null
CREATE TABLE sclass(
cid INT,
cname VARCHAR(20) NOT NULL,-- 非空约束
adress VARCHAR(20)DEFAULT '东南角'
);
INSERT INTO sclass VALUES(1,'太阳班','西北角')
-- Field 'cname' doesn't have a default value(报错)
INSERT INTO sclass(cid) VALUES(2)
-- Column 'cname' cannot be null(报错)
INSERT INTO sclass VALUES(2,NULL,'东北角')
-- 唯一约束 不能重复
注意:
1.唯一字段可以插入null;
2.唯一字段可以插入多个null
CREATE TABLE sclass(
cid INT,
cname VARCHAR(20) NOT NULL,-- 非空约束
adress VARCHAR(20)DEFAULT '东南角',-- 默认值
phone VARCHAR(16) UNIQUE -- 唯一约束(多个约束用空格)
);
INSERT INTO sclass VALUES(1,'小河班', '西南角','110')
-- Duplicate entry '110' for key 'phone'(报错)
INSERT INTO sclass VALUES(2,'大海班','西南角','110')
INSERT INTO sclass(cid,cname) VALUES(2,'小鸟班')
INSERT INTO sclass(cid,cname) VALUES(3,'小花班') -- 唯一约束可以插入多个null值
-- 主键约束 非空+唯一
CREATE TABLE sclass(
cid INT PRIMARY KEY,-- 主键约束
cname VARCHAR(20) NOT NULL,-- 非空约束
adress VARCHAR(20) DEFAULT '东南角',
phone VARCHAR(16) UNIQUE -- 唯一约束(多个约束空格)
);
INSERT INTO sclass VALUES(1,'小河班', '西南角','110')
-- Duplicate entry '1' for key 'PRIMARY'(报错)
INSERT INTO sclass VALUES(1,'大海班', '西南角','110')
-- Field 'cid' doesn't have a default value(报错)
INSERT INTO sclass(cname) VALUES('大海班')
-- Column 'cid' cannot be null(报错)
INSERT INTO sclass(cid,cname) VALUES(NULL,'大海班')
-- 自增长 从0开始增长
CREATE TABLE sclass(
cid INT PRIMARY KEY AUTO_INCREMENT,-- 主键约束 自增长
cname VARCHAR(20) NOT NULL,-- 非空约束
adress VARCHAR(20) DEFAULT '东南角',
phone VARCHAR(16) UNIQUE -- 唯一约束(多个约束空格)
);
自增长约束:必须是INT类型的主键约束才可以
-- Field 'cid' doesn't have a default value(报错)
INSERT INTO sclass(cname,phone) VALUES('小河班','110')
INSERT INTO sclass(cname,phone) VALUES('小河班','200')
INSERT INTO sclass(cid,cname,phone) VALUES(100,'小河班','180')
自增长:从哪里结束的增长,再从哪里开始增长
-- 清空表
DELETE FROM sclass; -- 不能约束自增长效果
TRUNCATE TABLE sclass; -- 删除表约束产生的效果,不能删除表本身,作为结构一部分,只能用drop删除
-- 零填充
DROP TABLE sclass;
CREATE TABLE sclass(
cid INT(5) ZEROFILL PRIMARY KEY AUTO_INCREMENT,-- 零填充 主键约束 自增长
cname VARCHAR(20) NOT NULL,-- 非空约束
adress VARCHAR(20) DEFAULT '东南角',
phone VARCHAR(16) UNIQUE -- 唯一约束(多个约束空格)
);
INSERT INTO sclass(cname,phone) VALUES('小河班','110')
SELECT * FROM sclass;
-- 外键 先创建主表,再创建外表
作用:用于解决两张表的数据冗余问题
注意:
1)被约束的表称为副表,约束别人的表称为主表,外键设置在副表上的!!!
2)主表的参考字段通用为主键!
3)添加数据: 先添加主表,再添加副表
4)修改数据: 先修改副表,再修改主表
5)删除数据: 先删除副表,再删除主表
-- 创建主表
CREATE TABLE dept(
did INT PRIMARY KEY AUTO_INCREMENT, -- 主键 自增长约束 INT类型
dname VARCHAR(10),
mgr VARCHAR(10)
);
-- 创建外表
CREATE TABLE emp(
eid INT PRIMARY KEY AUTO_INCREMENT, -- 外表主键
ename VARCHAR(10),
did INT, -- 外键
CONSTRAINT fk_emp_dept FOREIGN KEY(did) -- 括号里声明外键是哪个
REFERENCES dept(did) -- 外键约束
);
CONSTRAINT:建立约束; FOREIGN KEY:外键; REFERENCES:保持数据一致性,完整性
SELECT * FROM emp;
SELECT * FROM dept;
-- 外键约束
-- 修改数据 先改附表,再改主表
UPDATE emp SET did=2 WHERE eid=4;
UPDATE dept SET did=4 WHERE did=3;
-- 删除数据
DELETE FROM emp WHERE did=2;
DELETE FROM dept WHERE did=2;
SELECT * FROM emp;
SELECT * FROM dept;
-- 链接查询(多表查询)
连接就是指两个或2个以上的表(数据源)“连接起来成为一个数据源”,这只是一种内存形态,并不是真的形成了一个新的数据表
-- 交叉链接(没有 on 这个条件)
实际上,交叉连接是将两个表不设定任何条件的连接结果
SELECT * FROM emp JOIN dept
-- 内连接
SELECT * FROM emp JOIN dept ON emp.did=dept.did
-- 查询海绵宝宝所在的部门名称
SELECT dname FROM emp JOIN dept ON emp.did=dept.did
WHERE ename='海绵宝宝'
-- 查询开发部所有员工信息
SELECT * FROM emp JOIN dept ON emp.did=dept.did -- on后面是因为有重复,因此设置连接名
WHERE dname='开发部';
-- 左(外)连接
SELECT * FROM dept LEFT JOIN emp ON dept.did=emp.did -- left是这其中的关键字
-- 右(外)连接
SELECT * FROM emp RIGHT JOIN dept ON dept.did=emp.did -- right是这其中的关键字