外键:使两张表之间存在关联
特点:
1.从表外键的值是对主表主键的引用
2.从表外键类型,必须与主表主键类型一致
示例:
创建两个表并准备数据:
USE mybase; CREATE TABLE category( cid VARCHAR(32) PRIMARY KEY, cname VARCHAR(100) ); CREATE TABLE product( pid VARCHAR(32) PRIMARY KEY, pname VARCHAR(40), price DOUBLE, category_id VARCHAR(32) ); INSERT INTO category(cid,cname) VALUES('c001','家电'); INSERT INTO category(cid,cname) VALUES('c002','服饰'); INSERT INTO category(cid,cname) VALUES('c003','化妆品'); INSERT INTO product(pid,pname,price,category_id) VALUES('p001','联想','5000','c001'); INSERT INTO product(pid,pname,price,category_id) VALUES('p002','海尔','5000','c001'); INSERT INTO product(pid,pname,price,category_id) VALUES('p003','雷神','5000','c001'); INSERT INTO product(pid,pname,price,category_id) VALUES('p004','JACK JONES','800','c002'); INSERT INTO product(pid,pname,price,category_id) VALUES('p005','真维斯','200','c002'); INSERT INTO product(pid,pname,price,category_id) VALUES('p006','花花公子','440','c002'); INSERT INTO product(pid,pname,price,category_id) VALUES('p007','劲霸','2000','c002'); INSERT INTO product(pid,pname,price,category_id) VALUES('p008','香奈儿','800','c003'); INSERT INTO product(pid,pname,price,category_id) VALUES('p009','相宜本草','200','c003');
执行这段代码没有问题:
DELETE FROM category WHERE cid='c003';
添加外键关系:
ALTER TABLE product ADD FOREIGN KEY(category_id) REFERENCES category(cid);
这时候两个表中的数据就存在外键关系
执行这段代码就会出错:
DELETE FROM category WHERE cid='c003';
如果想成功,需要先删除和它有关的product表中的两条数据
如果从表添加数据,不能添加主表中不存在的记录,例如添加category_id为c004的数据
表与表之间的关系:
一对多:
实例:客户和订单,分类和商品
一个分类对应多个商品,一个商品只能属于某个分类
上边这个实例,就是一个一对多案例
多对多:
实例:学生选课
多名学生,选择多门课程,学生随意选择
需要注意多对多的建表方法:
创建第三张表作为中间表,至少两个字段
这两个字段分别作为外键指向各自一方的主键:
具体代码:
CREATE TABLE 从表( 字段1, 字段2, ... ) ALTER TABLE 从表 ADD FOREIGN KEY(字段1) REFERENCES 主表1(主键); ALTER TABLE 从表 ADD FOREIGN KEY(字段2) REFERENCES 主表2(主键);
一对一:
实例:公司的地址
一个公司对应一个地址,一对一
实际开发中不使用,通常写在一张表中即可
多表查询:
使用上边创建的两张表以及数据:
两张表的全集 SELECT * FROM category,product; 内连接查询 SELECT * FROM category INNER JOIN product ON cid=category_id; SELECT * FROM category c,product p WHERE c.cid=p.category_id; 外连接查询 SELECT * FROM category LEFT JOIN product ON cid=category_id; SELECT * FROM category RIGHT JOIN product ON cid=category_id; 子查询 SELECT cid FROM category WHERE cname='化妆品'; SELECT * FROM product WHERE category_id=(SELECT cid FROM category WHERE cname='化妆品');