MySQL约束机制+MySQL性别约束男、女(check虽不报错但没用)

约束

为了确保数据的完整性和唯⼀性,关系型数 据库通过约束机制来实现目。

  • unique 唯一性约束
    值不可重复;

  • not null 非空约束
    值不可为空;

  • default 默认值约束
    当增加数据时没有插⼊值时,会自动插⼊默认值;

  • check 检查约束
    MySQL不支持该约束,但写入语句不会报错; CHECK 约束:用于限制列中的值的范围

需求

在一些情况下,我们需要字段在指定范围的输入,

例如:性别只能输入'男'或者'女',余额只能大于0等条件,

我们除了在程序上控制以外,我们还能使用 CHECK 约束来规范数据。


然而

MySQL所有的存储引擎均不支持check约束,MySQL会对check子句进行分析,但是在插入数据时会忽略,因此check并不起作用


解决

因此实现对数据约束有两种方法:

  • 1.在mysql种约束,如使用enum类型或者触发器等。
  • 2.在应用程序里面对数据进行检查再插入。

实现

  • 创建一张测试表,规定sex字段只能是 ‘男’ 或者 ‘女’
CREATE TABLE `user` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(18)   NOT NULL,
  `sex` ENUM('男','女')   DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 

1.枚举类型使用 ENUM 限制插入的值,但是这种方式只能用于离散型数据,对于范围数据则无能为力

  • 测试:
INSERT INTO `user`(`name`,`sex`) VALUES('秀吉','秀吉');


# 结果:错误代码: 1265
Data truncated for column 'sex' at row 1

2.触发器如果我们需要限制范围内数据,例如:余额只能大于100这样的条件,我们可以使用触发器来实现。

  • 测试
DELIMITER $$
CREATE
    TRIGGER `test`.`remaining_BeforeInsert` BEFORE INSERT ON `test`.`user`
    FOR EACH ROW BEGIN
    IF `user`.`remaining` < 100 THEN  
        SET `user`.`remaining` = 100;  
    END IF;  
    END$$	DELIMITER ;

  • primary key主键约束
    主键约束 = 唯一性约束 + 非空约束,是一张表的代表性字段,

一张表只能有一个主键,

主键可以是一个字段,也可以是多个字段(联合主键,复合主键),

整形主键字段可以使用auto_increment(自动增长)修饰,

插入时不写主键字段值,值 = 上一列值 + 1;

  • foreign key 外键约束
    外键是另一表的主键,常用来和其他表建立联系

外键与主键的引用类型必须一致,如果主键是int外键是char则不行

一定要匹配主表中 引用的列 ( 所要创建的外键是主表中的主键 )

主键和外键的字符编码必须一致,如果主表为utf8,则此表也要为utf8

添加方式

  • 创建表的时候添加
    • 在字段后面直接添加
    • 在所有的字段后面起别名的方式添加
  • 表已经存在修改表添加

注:文中添加方式仅为示例,实际同时对一个字段同时添加多个约束会有bug,具体原因可以参见约束原理

创建表时在修饰字段末直接添加,不支持添加foreign key

		 create table stu1(sid int unique,sname char(20));
     create table stu2(sid int not null,sname char(20));
     create table stu3(sid int default 0,sname char(20));
     create table stu4(sid int primary key,sname char(20));

创建表时单独添加,constraint表示起别名,不支持添加default

			  create table stu5(sid int,
         sname char(20),
         constraint unique_stu unique(sid),
         constraint notnull_stu not null(sid),
         constraint pk_stu primary key(sid),
         constraint fk_stu foreign key(sid) references s(sid)
        );

表已经存在,且字段下的所有值符合约束条件

		 alter table stu add constraint unique_stu unique(sid);
    	 alter table stu add constraint notnull_stu not null(sid);
     alter table stu add constraint pk_stu primary key(sid);
     alter table stu add constraint fk_stu foreign key(sid) references s(sid);

查询约束信息,可查看约束名,table表示表名show keys from table;

删除约束,index表示约束名,table表示表名drop index on table;

©️2020 CSDN 皮肤主题: 黑客帝国 设计师:上身试试 返回首页