MySQL约束机制 您所在的位置:网站首页 如何设置字段有效性规则语句 MySQL约束机制

MySQL约束机制

2024-01-18 08:50| 来源: 网络整理| 查看: 265

1、CONSTRAINT 约束种类

为了确保数据的完整性和唯⼀性,关系型数 据库通过约束机制来实现目。(关于索引和约束的联系可以简单理解为创建约束不一定创建索引,但是创建索引如唯一、非空等索引会同时创建相应的的约束)

UNIQUE 唯一性约束 值不可重复;

NOT NULL 非空约束 值不可为空;

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

CHECK 检查约束 CHECK 约束:用于限制列中的值的范围,MySQL5.7不支持该约束,但写入语句不会报错,MySQL8.0版本支持该约束。

PRIMARY KEY主键约束 : 主键约束 = 唯一性约束 + 非空约束,是一张表的代表性字段。一张表只能有一个主键,主键可以是一个字段,也可以是多个字段(联合主键,复合主键),整形主键字段可以使用auto_increment(自动增长)修饰,插入时不写主键字段值,值 = 上一列值 + 1;

FOREIGN KEY 外键约束:外键是另一表的主键,常用来和其他表建立联系,外键与主键的引用类型必须一致,如果主键是int外键是char则不行 ,一定要匹配主表中 引用的列 ( 所要创建的外键是主表中的主键 )。主键和外键的字符编码必须一致,如果主表为utf8,则此表也要为utf8

1.1添加约束的方式 创建表的时候添加 在字段后面直接添加在所有的字段后面起别名的方式添加 表已经存在修改表添加 # 创建表时单独添加约束,`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; 2、MySQL5.7实现性别限制只能男、女

在一些情况下,我们需要字段在指定范围的输入,例如:性别只能输入 '男'或者'女',余额只能大于0等条件。

我们除了在程序上控制以外,我们希望使用 CHECK 约束 来规范数据。但是MySQL5.7所有的存储引擎均不支持check约束,MySQL会对check子句进行分析,但是在插入数据时会忽略,因此CHECK并不起作用

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

在MySQL的约束,如使用ENUM类型或者触发器等。在应用程序里面对数据进行检查再插入。 2.1、使用ENUM类型限制字段取值

创建一张测试表,规定sex字段只能是 ‘男’ 或者 ‘女’,使用 ENUM 限制插入的值,但是这种方式只能用于离散型数据,对于范围数据则无能为力

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 # 测试 INSERT INTO `user`(`name`,`sex`) VALUES('秀吉','秀吉');// 俺只是转载,秀吉是啥意思俺真的不懂\(^o^)/~ # 结果:错误代码: 1265 Data truncated for column 'sex' at row 1 2.2、使用触发器限制

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

DELIMITER $$ CREATE TRIGGER `test`.`remaining_BeforeInsert` BEFORE INSERT ON `test`.`user` FOR EACH ROW BEGIN IF `user`.`remaining`


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有