现在要说的是在列这一层次过滤的基于表定义之前就规范好的 CHECK 约束。(MySQL 版本 >= 8016)
mysql> create table f1 (r1 int constraint tb_f1_r1_chk1 check (mod(r1,3)=0));
Query OK, 0 rows affected (003 sec)
mysql> create table f2 (r1 int constraint tb_f2_r1_chk1 check (mod(r1,3)=0) not enforced);
Query OK, 0 rows affected (002 sec)
这里 CHECK 约束的相关限制如下:
1 constraint 名字在每个数据库中唯一。
也就是说单个数据库里不存在相同的两个 constraint,如果不定义,系统自动生成一个唯一的约束名字。
2 check 约束针对语句 insert/update/replace/load data/load xml 生效;针对对应的 ignore 语句失效。
3 并非每个函数都可以使用,比如函数结果不确定的:NOW(),CONNECTION_ID(),CURRENT_USER()。
4 不适用于存储过程和存储函数。
5 系统变量不适用。
6 子查询不适用。
7 外键动作(比如 ON UPDATE, ON DELETE) 不适用。
8 enforced 默认启用,如果单独加上 not enforced ,check 约束失效。
唯一约束保证在一个字段或者一组字段里的数据与表中其它行的数据相比是唯一的。
创建唯一约束可确保在不参与主键的特定列中不输入重复值。当唯一约束和主键都强制唯一性时,如果满足下列条件,则应将唯一约束而不是主键约束附加到表上。
表中只能有一个主键,但能有多个唯一性约束,MySQL在创建唯一约束时,会自动创建一个同名的唯一索引,该索引不能单独删除,删除约束会自动删除索引。唯一约束是通过唯一索引来实现数据的唯一。唯一性约束的字段可以为NULL。
扩展资料
如果约束设置enabled,则会检查新插入或更新的数据是否符合约束条件。
如果约束设置disabled,则表中可以包含,违反约束的记录。
如果约束设置validate,则表中存在的数据,必须符合约束。
如果约束设置novalidate,则表中存在的数据,不必符合约束。
validate和novalidate的行为,依赖于是否设置了enabled/disabled。
参考资料来源:百度百科-唯一约束
一、约束的分类在SQLServer中,有3种不同类型的约束。
1、实体约束
实体约束是关于行的,比如某一行出现的值就不允许出现在其他行,例如主键。
2、域约束
域约束是关于列的,对于所有行,某一列有那些约束,例如CHECK约束。
3、参照完整性约束
如果某列的值必须与其他列的值匹配,那就意味着需要一个参照完整性约束,例如外键。
二、约束命名搜索
在学习约束之前,首先来了解下为约束命名需要注意哪些地方。
SQLServer在我们不提供名称时,会自动创建名称,但是由系统自动创建的名称并不是特别有用。
例如,系统生成的主键名称可能是这样的:PK_Employees_145C0A3F。
PK代表主键(primary key),Employees代表在Employees表中,而剩下的“145C0A3F”部分是为了保证唯一性而随机生成的值。只有通过脚本创建才会得到这种值,如果是通过Managerment Studio创建表,那么就直接是PK_Employees。
1、首先,打开sqlserver软件,右键点击要设计的表选择设计,选中一列右键设置主键,该列就设置成了主键了,删除主键同理,设置好了前面有一把钥匙。
2、设置唯一键和索引键也是右键选中的列(空白的地方也行),点击‘索引/键’。
3、这里注意,刚刚选择的列不是在那个选中的列上设置,而是以整个表来设置的,因此能看到刚才设置的主键。
4、现在不是改信息而是新建一个,点击添加。
5、然后点击列,出来隐藏的省略号,再点击它。
6、选择要设置的列,后面可以设置排序。
7、再点击类型可以设置唯一键/索引/列存储索引,选择需要设置的。
8、最后就设置完成了,点击保存,到此就完成了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)