zoukankan      html  css  js  c++  java
  • MySQL常见约束分析

    MySQL的约束是一种限制,用于限制表中的数据,为了保证表中数据的准确性和可靠性。

    分类

    六大约束:

    •  NOT NULL :非空,用于保证该字段的值不能为空。例如学生表的学生姓名及学号等等。
    •  DEFAULT:默认值,用于保证该字段有默认值。例如学生表的学生性别
    •  PRIMARY KEY:主键,用于保证该字段的值具有唯一性并且非空。例如学生表的学生学号等。
    •  UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空。例如注册用户的手机号,身份证号等。
    •  CHECK:检查约束(MySql不支持),检查字段的值是否为指定的值。
    •  FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值,在从表添加外键约束,用于引用主表中某些的值。例如学生表的专业编号

    添加约束的时机

    •  创建表时
    •  修改表时

    约束的添加分类

    •  列级约束:六大约束语法上都支持,但外键约束没有效果
    •  表级约束:除了非空、默认、其它的都支持。

    添加列级约束   

    create table if not exists t_stuinfo(
        id int primary key,                         #主键
        stuName varchar(20) not null,                #非空
        gender char(1) check(gender='' or gender=''),    #检查约束,MySql没有效果但不报错
        seat int unique,                        #唯一约束
        age int default 18,                      #默认(值)约束
        majorId int references major(id)            #外键约束,MySql没有效果,但不报错
    );

    添加表级约束

    语法:在创建表字段的最下面

    constraint 约束名 约束类型(字段名)
    create table if not exists t_stuinfo(
        id int,
        stuName varchar(20),
        gender char(1),
        seat int,
        age int,
        majorId int,
        constraint pk primary key(id),                      #约束名随意,主键不生效,但不报错。
        constraint uq unique(seat),                         #唯一约束
        constraint ck check(gender='' or gender=''),    #检查约束,MySql不支持此约束,不报错但不生效
        constraint fk_stuinfo_major foreign key(majorId) references major(id)    #外键约束
    ); 

    主键和唯一的区别

    约束名称 保证唯一性 是否允许为空 一个表中可以有多少个 是否允许组合
    主键 × 最多有1个,可以没有 √(不推荐)
    唯一 可以有多个 √(不推荐)

    外键:

    • 要求在从表中设置外键关系
    • 从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求。
    • 主表的关联列必须时一个Key(一般为主键或唯一,外键也可以但无意义)
    • 插入数据时,先插入主表,再插入从表;删除数据时,先删除从表,再删除主表

    修改表时添加约束

    添加非空约束

    alter table 表名称 modify column 列名 列类型 not null;

    添加默认约束

    alter table 表名称 modify column 列名 列类型 default 默认值;1 

    添加主键

    列级约束方式
    alter table 表名称 modify column 列名 列类型 primary key;
    表级约束方式
    alter table 表名称 add primary key(id);

    添加唯一

    列级约束
    alter table 表名称 modify column 列名 列类型 unique;
    表级约束
    alter table 表名称 add unique(列名称);

    添加外键

    列级写法可行,但无效果
    表级约束
    alter table 表名称 add constraint fk_stuinfo_magor foreign key(magorId) references major(id);

    添加通用写法(语法)

    列级约束 
    alter table 表名称 modify column 列名 列类型 新约束;
    表级约束
    alter table 表名称 add constraint 约束名 约束类型(列名称) [外键的引用];

    修改表时删除约束

    删除非空约束

    alter table 表名称 modify column 列名 列类型 [null];

    删除默认约束

    alter table 表名称 modify column 列名 列类型;

    删除主键

    alter table 表名称 modify column id int;
    alter table 表名称 drop primary key;

    删除唯一

    alter table 表名称 drop index(索引名) 设置唯一时的名称;

    删除外键

    alter table 表名称 drop foreign key(索引名) 设置外键时的名称;

    标识列

      又称为自增长列,可以不用手动的插入值,系统提供默认的序列值。特点:

    • 标识列必须和一个Key搭配(Key指主键、唯一、外键....)
    • 一个表最多有一个标识列
    • 标识列的类型只能是数值型
    • 标识列可以通过SET auto_increment_increment = 3;设置步长(全局),可以通过插入行时手动插入标识列值设置起始值。

    创建表时设置标识列

    create table user(
        id int primary key auto_increment,
        name varchar(20)
    );

    修改表时设置标识列

    alter table 表名称 modify column id int primary key auto_increment;

    修改表时删除标识列

    alter table 表名称 modify column id int primary key;
  • 相关阅读:
    【LeetCode】048. Rotate Image
    【LeetCode】036. Valid Sudoku
    【LeetCode】060. Permutation Sequence
    【LeetCode】001. Two Sum
    【LeetCode】128. Longest Consecutive Sequence
    【LeetCode】081. Search in Rotated Sorted Array II
    【LeetCode】033. Search in Rotated Sorted Array
    顺时针打印矩阵
    矩形覆盖
    二维数组中的查找
  • 原文地址:https://www.cnblogs.com/johnvwan/p/15637097.html
Copyright © 2011-2022 走看看