Check

作用

检查某个字段的值是否符号xx要求,一般指的是值的范围

关键字

CHECK

说明:MySQL 5.7 不支持

MySQL5.7 可以使用check约束,但check约束对数据验证没有任何作用。添加数据时,没有任何错误或警告 但是MySQL 8.0中可以使用check约束了

  1. #创建check约束,添加的工资一定要大于2000元
  2. CREATE TABLE test10(
  3. id INT,
  4. last_name VARCHAR(15),
  5. salary DECIMAL(10,2) CHECK(salary > 2000)
  6. );
  7. INSERT INTO test10
  8. VALUES(1,'Tom',2500);
  9. #添加失败
  10. INSERT INTO test10
  11. VALUES(2,'Tom1',1500);
  12. SELECT * FROM test10;

DEFAULT约束

作用

给某个字段/某列指定默认值,一旦设置默认值,在插入数据时,如果此字段没有显式赋值,则赋值为默认值。

关键字

DEFAULT

如何给字段加默认值

(1)建表时

create table 表名称( 
字段名 数据类型 primary key, 
字段名 数据类型 unique key not null, 
字段名 数据类型 unique key, 
字段名 数据类型 not null default 默认值, 
);

#说明:默认值约束一般不在唯一键和主键列上加

在CREATE TABLE添加约束

CREATE TABLE test11(
id INT,
last_name VARCHAR(15),
salary DECIMAL(10,2) DEFAULT 2000 # 在不添加数据时,默认是2000
);

DESC test11;

#3000
INSERT INTO test11(id,last_name,salary)
VALUES(1,'Tom',3000);

#2000
INSERT INTO test11(id,last_name)
VALUES(2,'Tom1');

SELECT * 
FROM test11;

在ALTER TABLE添加约束

CREATE TABLE test12(
id INT,
last_name VARCHAR(15),
salary DECIMAL(10,2)
);

DESC test12;

#设置默认约束为2500
ALTER TABLE test12
MODIFY salary DECIMAL(8,2) DEFAULT 2500;

在ALTER TABLE删除约束

ALTER TABLE test12
MODIFY salary DECIMAL(8,2);

SHOW CREATE TABLE test12;

面试

面试1、为什么建表时,加 not null default ‘’ 或 default 0

答:不想让表中出现null值。

面试2、为什么不想要 null 的值

答:(1)不好比较。null是一种特殊值,比较时只能用专门的is null 和 is not null来比较。碰到运算符,通常返回null。
(2)效率不高。影响提高索引效果。因此,我们往往在建表时 not null default ‘’ 或 default 0

面试3、带AUTO_INCREMENT约束的字段值是从1开始的吗? 在MySQL中,默认AUTO_INCREMENT的初始

值是1,每新增一条记录,字段值自动加1。设置自增属性(AUTO_INCREMENT)的时候,还可以指定第一条插入记录的自增字段的值,这样新插入的记录的自增字段值从初始值开始递增,如在表中插入第一
条记录,同时指定id值为5,则以后插入的记录的id值就会从6开始往上增加。添加主键约束时,往往需要设置字段自动增加属性。

面试4、并不是每个表都可以任意选择存储引擎?

外键约束(FOREIGN KEY)不能跨引擎使用。
MySQL支持多种存储引擎,每一个表都可以指定一个不同的存储引擎,需要注意的是:外键约束是用来保证数据的参照完整性的,如果表之间需要关联外键,却指定了不同的存储引擎,那么这些表之间是不能创建外键约束的。所以说,存储引擎的选择也不完全是随意的。