五、MySQL键值约束条件

约束条件

约束条件:作用是限制如何给字段赋值

NULL 是否允许为空

- 默认允许 null
- 不允许为空 not null
mysql> create table tb2 (
	name char(10) not null
);

DEFAULT 默认值

不给字段赋值时使用默认值赋值
默认不定义时 是 null
定义	default 值 	(要与字段类型匹配)
mysql> create table tb3 (
    name char(10) not null default "",
    age tinyint unsigned default 17,
    sex enum("boy","gril") not null default "boy"
    );

# default "" 是0个字符 不是null 

Key 键值索引

  • Key 键值索引 不定义时没有键值

    1. index			普通索引
    2. unique			唯一索引
    3. fulltext			全文索引
    4. primary key		主键
    5. foreign key		外键
    
  • 索引是什么

    类似于书的目录
    对表中字段进行排序
    索引类型包括: Btree B+tree hash
    
  • 索引的优缺点

    索引优点
      - 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
      - 可以加快数据的查询速度
    索引缺点
      - 当对表中的数据进行增加、删除和修改的时候,索引也要动态的调整,降低了数据的维护速度
      - 索引需要占物理空间
    

Index 普通索引

  • 使用规则

    一个表中可以有多个index字段
    字段的值允许重复,且可以赋NULL值
    通常把作为条件查询的字段设置为index字段
    index字段 标志是MUL
    
    # 创建索引后,存入字段索引会存在表所对应的文件中 例: /var/lib/mysql/db1/ *.frm *.ibt
    
  • 创建索引

    # 建表时创建索引
    	- create table 库.表名(字段, index(字段名));
    # 在已有表里创建索引
    	- create index 索引名 on 表名(字段名);
    
    CREATE TABLE tb4(
        id char(6) NOT NULL,
        name varchar(4) NOT NULL,
        age int(3) NOT NULL,
        gender ENUM("boy","girl") DEFAULT "boy",
        INDEX(id), INDEX(name)
    );
    
    CREATE INDEX nianling ON tb4(age);
    
  • 查看索引字段

    # 基本查看
      - desc 表名;
    # 详细信息查看 (\G 竖着来查看)
      - show index from 表名 [\G];
    
    mysql> show index from tb4;
    mysql> show index from tb4 \G;
    
  • 删除索引字段

    drop index 索引名 on 表名;
    
    mysql> DROP INDEX nianling ON tb4;
    mysql> DROP INDEX name ON tb4;
    

Primary KEY 主键

  • 使用规则

    字段值不允许重复,切不允许赋NULL值
    一个表中只能有一个primary key字段
    多个字段都作为主键,称为复合主键,必须一起创建
    主键字段标志是PRI
    主键通常与auto_increment连用
    通常把表中唯一表示记录的字段设置为主键
    
  • 建表时创建主键

    方法一
      - create table 库名.表名(字段1 类型 primary key, 字段2 类型);
    方法二
      - create table 库名.表名(字段1 类型, 字段2 类型, primary key(字段1));
    
    mysql> create table tb5 (name char(3) primary key, id int(3));
    mysql> create table tb6 (name char(3), id int(3), primary key(name));
    
  • 在已有表里创建主键

    # 在已有表里创建主键
      - alter table 库名.表名 add primary key(字段名);
    # 对已有表添加复合主键
      - alter table 表名 add primary key(字段名列表);
    
    mysql> alter table tb3 add primary key(name);
    mysql> alter table tb2 add primary key(id, name);
    
    # 创建表的时候设置复合主键
    create table tb7(
        name char(10),
        class char(7),
        status enum("yes","no"),
        primary key(name, class)
    );
    # 与auto_increment连用, ps:auto_increment 自增长(必须是主键)
    # 自增长从主键中最大的值开始
    # 清空表之后在次写入也是从之前最大的值开始(有记录)
    # auto_increment字段赋空值的话使用自增长
    create table tb8(
        id int primary key auto_increment,
        name char(10),
        sex enum("man","woman")
    );
    
  • 删除主键

    # 不管是复合主键还是单条主键,统一删除
    alter table 表名 drop primary key;
    

Foreign KEY

  • 什么是外键

    外键功能: 向表中插入记录时,字段的值在另外一张表字段值里选择
    
    使用规则
     - 表存储引擎必须是innodb
     - 字段类型要一致
     - 被参照字段必须要是索引类型的一种(primary key)
    
  • 创建外键

    create table 表名(
        字段名列表, 
        foreign key(字段名) references 库.表(字段名)
        on update cascade # 同步更新
        on delete cascade # 同步删除
    )engine=innodb;	# 指定存储引擎 mysql 5.7默认使用innodb
    
    # 同步更新 与主表所关联字段会随着主表的变化而变化
    # 同步删除 主表记录删除,跟随删除
    
    mysql> create table tb1(id int(10) primary key, name char(5), age int(2), addr char(30));
    
    mysql> show create table tb1;	# 查看表结构是否使用innodb
    
    mysql> create table info1(id int(10),sex char(5),foreign key(id) references tb1(id) on update cascade on delete cascade);
    mysql> show create table info1;
    
  • 删除外键

    # 查看外键名称
      - show create table 表名;
    # 删除外键
      - alter table 表名 drop foreign key 外键名称;
      
    # 删除外键只是相当于删除一个关系,不会改动已有数据
    
    mysql> show create table info1;
    ......
    | info1 | CREATE TABLE `info1` (
      `id` int(10) DEFAULT NULL,
      `sex` char(5) DEFAULT NULL,
      KEY `id` (`id`),
      CONSTRAINT `info1_ibfk_1` FOREIGN KEY (`id`) REFERENCES `tb1` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
    
    mysql> alter table info1 drop foreign key info1_ibfk_1;
    
    mysql> show create table info1;
    mysql> desc info1;
    

Extra 额外设置

额外设置 默认都没有额外设置
posted @ 2021-11-16 10:52  CatdeXin  阅读(82)  评论(0)    收藏  举报