mysql约束

本文详细介绍了SQL数据库中的各种约束,包括行级约束(如NULLNOTNULL、UNIQUE和DEFAULT)、主键约束的定义和作用,以及表级约束(如PRIMARYKEY和FOREIGNKEY)。讨论了外键约束的不同类型和级联删除行为,并针对一对多和多对多关系的表设计提供了指导。
摘要由CSDN通过智能技术生成

约束

就是使用一些规则限制数据,保证数据合法性/准确性,从而满足需求

-- 分类:
1. 行级约束(对某一列进行限制) 在列类型的后面的约束  可以出现多次
1.1 NULL NOT NULL 非空约束
1.2 UNIQUE 唯一性约束/索引(是数据结构)
    保证列的数据唯一
    在一张表里面使用多次UNIQUE修饰多个列。
1.3 DEFAULT 默认约束(设置默认数据)
1.4 PRIMARY KEY 主键约束(重要)
    1.既可以是行级约束,又可以是表级约束,自带索引的
    2.一张表里面只能使用1次 PRIMARY KEY
    3.使用 PRIMARY KEY 修饰的列一般称为"主键列"
    4.主键列的数据: 非空+唯一
    5.理论上任意一个列都可以作为主键列。实际开发中,一般都是id. 
    5。 为什么要使用主键约束?
        1. 保证记录唯一性。
        2. 满足表设计的3大范式。
            2.1 第一范式: 保证列的原子性 列不可再分的原则。
            2.2 第二范式: 在满足第一范式前提下,保证行记录的唯一性.建议使用主键列
            2.3 第3范式: 在满足第2范式前提下,减少列/数据的冗余。排除外键列的数据。
    NOT NULL+UNQIUE==主键约束
    新增的时候 每次都要自已维护id的唯一性保证id数据唯一性?
    1.mysql服务器,id自己自增(使用居多) 要求 列必须是主键约束/整数类型
    2。java程序控制 提供唯一的数据 作为id的数据
    问题: id是字符类型,保证数据的唯一性? 不能自增了
    1.java程序提交唯一的id
    2.mysql服务: UUID() UUID_SHORT()
    uuid: 128位 由16进制的字符组成的串
需求:设置id自增 auto_increment默认从1开始 自增的步长 1 当然可以修饰自增的初始值以及步长  有索引才能自增
ALTER TABLE a MODIFY id INT auto_increment;
获得上一次自增的id数据
SELECT LAST INSERT ID();
修改自增的初始值或者步长
ALTER TABLE a auto_increment 2001;
更改步长  set 指全局
SET auto increment_increment=5;


2. 表级约束
2.1 PRIMARY KEY(联合主键)位置: 在最后一个列的后面使用
    CREATE TABLE C(
        id BIGINT(1) auto increment,
        name VARCHAR(20),
        PRIMARY KEY(id)-- 表级约束
    使用navicat可以点击多次主键 意味着表里面有联合主键
    联合主键: 必须使用表级约束编写
             多个列作为一个主键列体现
    一般出现的场景: 在中间表里面
2.2 FOREIGN KEY 外键约束(维护多表关系的)
       外键约束,自带索引。
    维护多张表的关系。
    1.在一张表里面,可以使用多次 FOREIGN KEY修饰多个列。
    2.使用 FOREIGN KEY修饰的列,称为"外键列"一张表中,外键列可以有多个的。
    3.外键列的数据不能对于设置。外键列的数据要严格参照另外一张表的主键列的数据。
    4.主表与从表之间关系。有外键列在的表,称为"从表"。外键列的数据参照的表就是"主表/基表"。从表里面外键列的数据严格参照主表里面主键列的数据。
    5.外键列的数据类型与主表的主键列的数据类型一致。
     意义:
     保证数据安全性。性能低。
     要使用外键约束,必须要保证数据库存储引擎是InnoDB
外键约束都在从表里面进行设置
ALTER TABLE 从表 ADD constraint foreign key (从表id) references 主表(id);
建表时:
foreign key(uid) references 主表(id)
 外键三个特性(在开发中禁止使用)
 --RESTRICT--
1.操作主表
SELECT * FROM sys user;-- ok
INSERT INTo sys user(true name)VALUES('admin');
UPDATE sys user SET age=20 WHERE id=1;--ok
DELETE FROM sys user WHERE id=3;
DELETE FROM sys user WHERE id=1;
删除主表 遍历查询所有子表是否关联使用id的数据
没有使用 可以删除
子表在使用这些数据  无法删除的
保证数据安全性
--SET NULL--
1.操作主表
SELECT * FROM sys user;-- OK
INSERT INTO sys user(true_name)VALUES('admin');-- ok
UPDATE sys user SET age=30 WHERE id=2;-- ok
DELETE FROM sys user WHERE id=4;
DELETE FROM sys user WHERE id=1;
删除主表 遍历查询所有子表是否关联使用id的数据
没有使用可以删除
子表在使用这些数据,会遍历式的先设置子表里面的外键列的数据为null 然后再删除主表的记录
--CASCADE(级联)--
1.操作主表
SELECT * FROM sys user;-- ok
INSERT INTo sys user(true name)VALUES('admin');-- OK
UPDATE sys user SET age=30 WHERE id=5;-- ok
DELETE FROM sys user WHERE id=5;
DELETE FROM sys user WHERE id=2;
删除主表遍历查询所有子表是否关联使用id的数据
没有使用 可以删除
子表在使用这些数据会遍历式的删除子表相关记录 然后再删除主表的记录

表设计

1.一对一
    随便一张表加外键 维护关系
2.一对多
    将'外键列'加在多的表上 维护关系
3.多对多
    中间表 两个外键列

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值