JavaWeb 3 约束 非空约束 唯一约束 主键约束 默认约束 外键约束 数据库设计 夺标查询 事务
约束
非空约束
外键约束
drop table if exists emp; drop table if exists dept; -- 部门表 create table dept( id int primary key auto_increment, dep_name varchar(20), addr varchar(20) ); -- 员工表 create table emp( id int primary key auto_increment, name varchar(20), age int, dep_id int, -- 添加外键 dep_id, 关联 dept 表的id主键 constraint fk_emp_dept foreign key(dep_id) references dept(id) ); -- 添加 2 个部门 insert into dept(dep_name,addr) values ('研发部','广州'),('销售部', '深圳'); -- 添加员工,dep_id 表示员工所在的部门 INSERT INTO emp (NAME, age, dep_id) VALUES ('张三', 20, 1), ('李四', 20, 1), ('王五', 20, 1), ('赵六', 20, 2), ('孙七', 22, 2), ('周八', 18, 2); -- 删除外键 alter table emp drop FOREIGN key fk_emp_dept; -- 建完表后,添加外键 alter table emp add CONSTRAINT fk_emp_dept FOREIGN key(dep_id) REFERENCES dept(id);
案例
--先删除以及有的表 drop table if exists emp; drop table if exists emp; create table emp( id int primary key auto_increment,-- 员工id,主键且自增长 ename varchar(50) not null unique,-- 员工姓名,非空并且唯一 joindate date not null,-- 入职日期 非空 salary double(7,2) not null,-- 工资,非空 bonus double(7,2) default 0 -- 奖金,如果没有奖金默认为0 ); -- 添加数据 insert into emp(id,ename,joindate,salary,bonus) values(1,'颤三','1998-09-09',30000,3000); -- 演示主键约束: 非空并且唯一 insert into emp(id,ename,joindate,salary,bonus) values(null,'颤三','1998-09-09',30000,3000); insert into emp(id,ename,joindate,salary,bonus) values(1,'颤三','1998-09-09',30000,3000); insert into emp(id,ename,joindate,salary,bonus) values(2,'颤三','1998-09-09',30000,3000); -- 非空 insert into emp(id,ename,joindate,salary,bonus) values(null,'颤三','1998-09-09',30000,3000); -- 唯一 insert into emp(id,ename,joindate,salary,bonus) values(1,'颤三','1998-09-09',30000,3000); -- 演示默认约束 insert into emp(id,ename,joindate,salary,bonus) values(4,'颤三999','1998-09-09',30000,null); INSERT INTO emp(id,ename,joindate,salary,bonus) values(5,'赵六','1999-11-11',8800,2000); -- 演示自动增长: auto_increment: 当列是数字类型,并且唯一约束 insert into emp(ename,joindate,salary,bonus) values('赵六','1999-11-11',8800,null); insert into emp(id,ename,joindate,salary,bonus) values(null,'赵六2','1999-11-11',8800,null); insert into emp(id,ename,joindate,salary,bonus) values(null,'赵六3','1999-11-11',8800,null);
数据库设计
表关系
多对多
/* 多对多: * 如:订单 和 商品 * 一个商品对应多个订单,一个订单包含多个商品 实现方式:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键 */ -- 删除表 DROP TABLE IF EXISTS tb_order_goods; DROP TABLE IF EXISTS tb_order; DROP TABLE IF EXISTS tb_goods; -- 订单表 CREATE TABLE tb_order( id int primary key auto_increment, payment double(10,2), payment_type TINYINT, status TINYINT ); -- 商品表 CREATE TABLE tb_goods( id int primary key auto_increment, title varchar(100), price double(10,2) ); -- 订单商品中间表 CREATE TABLE tb_order_goods( id int primary key auto_increment, order_id int, goods_id int, count int ); -- 建完表后,添加外键 alter table tb_order_goods add CONSTRAINT fk_order_id FOREIGN key(order_id) REFERENCES tb_order(id); alter table tb_order_goods add CONSTRAINT fk_goods_id FOREIGN key(goods_id) REFERENCES tb_goods(id);