设置外键约束如下:
-- 创建表emp员工表
create table emp(
id int primary key,
name varchar(50) not null unique,
age int,
dep_id int
);
select * from emp;
-- 创建表dept部门表
create table dept(
id int primary key,
dep_name varchar(50) unique,
address varchar(50)
);
select * from dept;
-- 删除表emp和表dept
drop table emp;
drop table dept;
create table emp(
id int primary key,
name varchar(50) not null unique,
age int,
dep_id int,
-- 添加外键dep_id,关联dept表的id主键
CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES dep(id)
);
-- 要先创建部门表和部门数据再创建员工表和员工数据 即:
create table dept(
id int primary key auto_increment,
dep_name varchar(50) unique,
address varchar(50)
);
insert into dept(id,dep_name,address)values(1,'研发部','广州');
insert into dept(id,dep_name,address)values(2,'技术部','深圳');
select * from dept;
create table emp(
id int PRIMARY KEY auto_increment,
name varchar(50) ,
age int,
dep_id int,
-- 添加外键dep_id,关联dept表的id主键
CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES dept(id)
);
select * from emp;
insert into emp(id,name,age,dep_id)values(1,'张三',18,1);
insert into emp(id,name,age,dep_id)values(null,'赵四',19,1);
insert into emp(id,name,age,dep_id)values(null,'王五',20,2);
insert into emp(id,name,age,dep_id)values(null,'李六',18,1);
insert into emp(id,name,age,dep_id)values(null,'孙七',17,2);
insert into emp(id,name,age,dep_id)values(null,'朱八',21,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);
-- ------------------以上创建的表为多对一关系的表
-- 而要创建多对多关系的表则需要额外创建一个中间表
类似于(订单和货物表,一个订单可以有多个货物,而一个货物也可以被多个订单所购买):
-- 订单商品表
-- 订单表
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)
);
insert into tb_order(id,payment,payment_type,status)values(1,7376.00,'微信支付',1);
insert into tb_order(id,payment,payment_type,status)values(59880.00,'支付宝支付',0);
-- 订单商品中间表
create table tb_order_goods(
id int primary key auto_increment,
order_id int,-- 订单id
goods_id int,-- 货物id
-- 一般会添加一个购买数量
count int not null
);
-- 建立完成表后添加外键
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);
-- 子查询
select * from emp;
select * from emp where age<20;
-- 相当于是嵌套查询,而括号内的是子查询
select * from emp where age<(select age from emp where id=3);
select * from emp,dept;
-- 查询技术部的员工信息(单行单列)
select * from emp where dep_id=1;
-- 查询年龄在18到20的员工(多行单列)
select* from emp where age in(18,19,20);
-- 查询员工信息和部门信息(多行多列)
select * from (select * from emp where age>19) t1,dept where t1.dep_id=dept.id;
create table cnt(
id int primary key auto_increment,
name varchar(10) unique,
count double(10,2)
);
insert into cnt(id,name,count)values(1,'张三',1000);
insert into cnt(id,name,count)values(null,'李四',1000);
-- 转账操作
-- 开启事务
BEGIN;
-- 李四金额-500
update cnt set count=count-500 where name='李四';
-- 张三金额+500
update cnt set count=count+500 where name='张三';
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;
select * from cnt;
update cnt set count=1000;
-- 两种提交方式
-- 1.默认自动提交
select @@autocommit;
-- 2.添加下面这个就是手动提交
set @@autocommit=0;
update cnt set count=count+500 where name='李四';
-- 默认自动提交相当于在这里有一个commit,而手动提交则要在这里写commit才能够提交
commit;