【Javaweb】MySQL约束与设计③

 约束

  • 约束是作用于表中列上的数据,用于限制加入表的数据
  • 约束的存在保证了数据库中数据的完整性、正确性、有效性

约束名称

  描述

关键字

非空约束

  保证列中所有数据不能有null值

not null

唯一约束

  保证列中所有的数据各不相同

unique

主键约束

  主键是一行数据的唯一标识

primary key

检查约束

  保证列中的值满足某一条件

check

默认约束

  保存数据时,未指定值则采用默认值

default

外键约束

  外键用来让两个表的数据之间建立联系,保证数据的一致性和完整性  

foreign key

MySQL不支持检查约束,可以在java代码中完成约束

-- 主键的自动增长

id int primary key auto_increment,  


-- 员工表

create table emp(
    id int primary key,                 -- 员工id,主键且自增长
    ename varchar(50) not null unique,  -- 姓名,非空且唯一
    joindate date not null,             -- 入职日期,非空
    salary double(7,2) not null,        -- 工资,非空
    bonus double(7,2) default 0         -- 奖金,默认为0
);


-- 插入wdh的数据

insert into emp (
        id,
        ename,
        joindate,
        salary,
        bonus
)

Values(
        1,
        '王大珩',
        '2022-02-10',
        '8000',
        '5000'
);

-- 当你不想给'社会你虎哥'奖金时,就不添加奖金,默认为0
-- 但不能使用 null 代替0,因为在SQL中 null 和 0 不同

INSERT INTO emp (
        id,
        ename,
        joindate,
        salary
)

VALUES(
        3,
        '社会你虎哥',
        '2020-06-30',
        10000
);

外键约束(难点)

狭义上讲:外键约束就是根据两个表的数据的物理联系建立的计算机层面的联系

constraint fk_新表_原表 foreign key(外键列名) references 主表(主表中的列名)

主表 ↑      建立联系后,主表的id和从表dep_id相同值对应的类型相同


从表 ↓

在建立主从表联系之后,不能直接删除主表中的元素,除非从表中带有某个主表的元素全部不存在,才能删除该元素

(比如假设主表中的丁真割割被KTV了,才能删除 " 3,'外贸部','上海' " 这一行)

逆向表到模型

-- 建立部门表

CREATE table dept(
    id int PRIMARY KEY auto_increment,
    dep_name varchar(10) not null unique,
    addr varchar(10)
);

-- 建立员工表

CREATE table emp2(
    id int PRIMARY KEY auto_increment,
    name varchar(50) not null unique,
    age int not null,
    dep_id int,
    -- 添加外键 dep_id, 关联 dept 表的id主键
    constraint fk_emp1_dept foreign key(dep_id) references dept(id)
);

select * from emp2;
select * from dept;

-- 添加部门信息

insert into dept(dep_name,addr) values
('研发部','四川'),('销售部','东百'),('外贸部', '上海');

-- 添加员工 dep_id 表示员工所在的部门

insert into emp2(name, age, dep_id) values
('孙狗', 30, 1),
('李老八', 30, 1),
('丁真', 18, 3),
('赵三金', 23, 2),
('二次元刀酱', 38, 2),
('唐老鸭', 22, 2);

表关系

  • 一对一

            如:用户和用户详情

  • 一对多(多对一)

            如:部门和员工,一个部门对应多个员工,一个员工对应一个部门

  • 多对多

             如:商品和订单,一个商品对应多个订单,一个订单包含多个商品

实例模型:

        一对多:部门-员工模型

        多对多:淘宝-电商模型

        一对一:用户-用户详情模型

源码参照前一节的数据库约束

-- 创建订单表

create table tb_order(
    id int primary key,
    payment double(7,2) not null,
    payment_type varchar(20) not null,
    status varchar(10) not null
);


-- 创建商品表

create table tb_goods(
    id int primary key,
    title varchar(30) not null,
    price double(7,2)
);


-- 创建订单商品中间表

create table tb_order_goods(
    id int primary key,
    order_id int not null,
    goods_id int not null,
    count int default 1
);


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);

create table tb_user(
    id int primary key,
    nickname varchar(20) not null,
    age int not null,
    gender char(8) default '保密'
);


create table tb_user_desc(
    id int primary key,
    city varchar(20) not null,
    edu varchar(20) not null,
    income int,
    status varchar(20) default '保密'
);


alter table tb_user_desc add constraint fk_user_desc foreign key (id) references tb_user(id);


insert into tb_user values
(1, '山泥若',20,'男'),
(2, '丁真',22,'男'),
(3, '冯雪娟',32,'女');


insert into tb_user_desc values
(1, '上海','本科',800000,'单身'),
(2, '上海','初中',137666,'单身'),
(3, '成都','带专',3000,'离异');


select * from tb_user;

select * from tb_user_desc;

 部分图源:黑马程序员

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

瑶湖女子师专王大珩

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

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

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

打赏作者

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

抵扣说明:

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

余额充值