mysql外键约束

一、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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸭鸭老板

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值