-- 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是外键,主表中没有id为5的,所以没法插入
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;