一、foreign key(外键)
定义主表和从表之间的关系:外键约束要定义在从表上,主表必须具有主键约束或unique约束,当定义外键约束后,要求外键列数据必须在主表的主键列存在或为null
foreign key(本表字段名)references 主表名(主键名或unique字段名)
-- 主键
-- 创建主表my_class
CREATE TABLE my_class(
id INT PRIMARY KEY,
`name` VARCHAR(32) NOT NULL DEFAULT''
);
-- 从表my_stu
CREATE TABLE my_stu(
id INT PRIMARY KEY,
`name` VARCHAR(32) NOT NULL DEFAULT '',
class_id INT,
-- 指定外键
FOREIGN KEY (class_id) REFERENCES my_class(id)
);
-- 添加数据
INSERT INTO my_class VALUES(1,'数学'),(2,'语文')
SELECT*FROM my_class
INSERT INTO my_stu VALUES(1,'xiaoming',1),(2,'liming',2)
INSERT INTO my_stu VALUES(3,'laowang',3)-- 添加失败
二、外键细节
1.外键指向的表的字段,要求是primary key 或者是unique
2.表的类型是innodb,这种表才支持外键
3.外键字段的类型要和主键字段的类型一致(长度可以不同)
4.外键字段的值,必须在主键字段中出现过,或者为null[但必须是外键字段可以为null]
5.一旦建立主外键关系,数据就不能随意删除
三、check
1.用于强制行数据必须满足条件,如果在那列上定义了check约束,那么那列必须在规定的范围,否则会提示出错。
2.oracle和sql server 支持check,mysql5.7当前还不支持check,只做语法校验,不会生效
语法: 列名 类型 check (check条件)
user表
id,name,sex(man,woman),sal(大于100小于1000)
-- check使用
CREATE TABLE db22(
id INT PRIMARY KEY,
`name` VARCHAR(32),
sex VARCHAR(32) CHECK (sex IN('man','woman')),
sal DOUBLE CHECK (sal>1000 AND sal<10000)
);
-- 添加数据
INSERT INTO db22 VALUES(1,'xiao','nan',10)
SELECT*FROM db22
四、商品表设计(练习)
CREATE DATABASE shop_db
-- 商品表
CREATE TABLE goods(
goods_id INT PRIMARY KEY,
goods_name VARCHAR(64) NOT NULL DEFAULT'',
unitprice DECIMAL(10,2) NOT NULL DEFAULT 0
CHECK (unitprice>=1.0 AND unitprice<=9999.99),
category INT NOT NULL DEFAULT 0,
provider VARCHAR(64) NOT NULL DEFAULT''
);
-- 客户表
CREATE TABLE customer(
customer_id INT PRIMARY KEY,
`name` VARCHAR(64) NOT NULL DEFAULT'',
address VARCHAR(64) NOT NULL DEFAULT'',
email VARCHAR(64) UNIQUE NOT NULL,
sex ENUM('男','女')NOT NULL,-- 使用枚举类型
card_id CHAR(18);
);
-- 订单表
CREATE TABLE purchase(
order_id INT PRIMARY KEY,
customer_id INT NOT NULL DEFAULT'',
goods_id INT NOT NULL DEFAULT 0,
nums INT NOT NULL DEFAULT 0,
FOREIGN KEY (customer_id) REFERENCES customer(customer_id),
FOREIGN KEY (goods_id) REFERENCES goods(goods_id)
);
DESC goods
DESC customer
DESC purchase