数据库约束详解

约束

  1. NOT NULL:非空约束,强制列不接受 NULL 值,约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。
  2. UNIQUE:唯一性约束,约束唯一标识数据库表中的每条记录,具有UNIQUE约束的列的值在这一列具有唯一性。
  3. PRIMARY KEY:主键约束,有自定义的UNIQUE和NOT NULL约束,并且每个表只有一个主键.
  4. FOREIGN KEY:外键约束,指向另一个表中的 UNIQUE(唯一约束的键)。
  5. CHECK:检查约束,用于限制列中的值的范围,如果对一个表定义 CHECK 约束,那么此约束会基于行中其他列的值在特定的列中对值进行限制。MySQL不支持。
  6. DEFAULT:约束用于向列中插入默认值。如果没有规定其他的值,那么会将默认值添加到所有的新记录。

列级约束

创建表时添加列级约束:
语法格式

CREATE TABLE IF NOT EXISTS 表名(
列名 类型 约束,
列名 类型 约束,
列名 类型 约束
);

举例说明
创建有students表,如下要求,ID列作为表的标识列,NAME不能为空,如果没有爱好(HOBBY),就默认是读书,姓名只能是男和女,年龄(age)只能是>10&&<16;

CREATE TABLE IF NOT EXISTS students(
	id INT(10) PRIMARY KEY,#主键约束
	NAME VARCHAR(20) NOT NULL,#非空约束
	hobby VARCHAR(255) DEFAULT '读书',#默认约束
	gender CHAR(1) CHECK(gender='男' OR gender='女')#检查约束
	age INT CHECK(age>10 AND age<16)#检查约束
);

表级约束

表级约束不支持非空约束和默认约束。
在创建表时添加表级约束:
语法

CREATE TABLE IF NOT EXISTS 表名(
列名 类型,
列名 类型,
列名 类型,
CONSTRAINT 约束名 约束类型(列名),#CONSTRAINT,约束名可以省略
CONSTRAINT 约束名 约束类型(列名),
...
);

举例说明
设计表,有字段emp_id 员工表的主键,dept_id 部门表的主键,员工表的外键,建表时要先建部门表。

CREATE TABLE IF NOT EXISTS employees(
emp_id INT(10),
job VARCHAR(20),
name VARCHAR(20),
gender CHAR(1),
sal DOUBLE(7,2),
dept_id INT,
CONSTRAINT PK PRIMARY KEY(emp_id),#主键,在MySQL中主键的约束名无法修改
CONSTRAINT fk_employees_departments FOREIGN KEY(dept_id) REFERENCES departments(id)#外键,约束名一般包含两张表的表名
#如下写法也可以
# PRIMARY KEY(emp_id),
# FOREIGN KEY(dept_id) REFERENCES departments(id)
);

联合主键:

就是当作为主键的字段可能存在重复值,无法确定这条数据的唯一性时,再加上一个字段,两个字段联合起来确定这条数据的唯一性。
语法格式:

PRIMARY KEY(字段1,字段2)

主键和唯一键的区别

  1. 主键一张表中只有一个,而唯一键可以有多个;
  2. 主键不允许为NULL,唯一键可以为NULL;
  3. 两者都可以组合,但不推荐
  4. 两者都保证唯一性

注意:
创建a表时需要b表的字段1作为a表的外键列,那么b就是主表,a就是从表;而且主表必须先存在,删除时要先删除从表才能删主表。

外键的特点

  1. 从表的外键列的类型和主表的关联列的类型要求一致或兼容;
  2. 主表的关联列必须是键,一般是唯一键或者主键;
  3. 插入数据时,先插入主表再插入从表,删除数据时,先删除从表再删除主表;

修改表时添加约束

列级约束语法

ALTER TABLE 表名 MODIFY COLUMN 列名 类型 约束类型;

表级约束写法

ALTER TABLE 表名 ADD 约束类型(列名);
1. 添加非空约束
ALTER TABLE 表名 MODIFY COLUMN 列名 类型 NOT NULL;
2. 添加默认约束
ALTER TABLE 表名 MODIFY COLUMN 列名 类型 DEFAULT;
3.添加检查约束(MySQL不支持检查约束)
ALTER TABLE 表名 ADD CONSTRAINT 约束名 CHECK(约束条件);
3. 添加主键
#方式一:列级约束的写法
ALTER TABLE 表名 MODIFY COLUMN 列名 类型 PRIMARY KEY;
#方式二:表级约束的写法
ALTER TABLE 表名 ADD PRIMARY KEY(列名);
4. 添加唯一约束
#方式一:列级约束的写法
ALTER TABLE 表名 MODIFY COLUMN 列名 类型 UNIQUE;
#方式二:表级约束的写法
ALTER TABLE 表名 ADD UNIQUE(列名);
5.添加外键
#列级约束不支持外键就不写了
ALTER TABLE 表名 ADD FOREIGN KEY(外键列列名) REFERENCES 主表(联合列列名);

修改表时删除约束

1.删除非空约束
ALTER TABLE 表名 MODIFY COLUMN 列名 类型;
2.删除默认约束
ALTER TABLE 表名 MODIFY COLUMN 列名 类型;
3.删除唯一约束
ALTER TABLE 表名 DROP UNIQUE 键名;
4.删除主键
ALTER TABLE 表名 DROP PRIMARY KEY;
5.删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 键名;

标识列(自增长列)

在插入数据时,不需要用户自己插入值,系统提供默认的序列值.关键字时AUTO _INCREMENT。
特点:
①:要求自增长列是一个key;
②:一个表至多只有一个标识列;
③:标识列的类型只能是数值型;
④:可以通过【SET AUTO_INCREMENT_INCREMENT=值】来设置步长;也可以通过手动插入值来设置起始值;

  1. 创建表时设置标识列;
    语法格式:

    CREATE TABLE 表名(
    	列名 类型 约束 AUTO_INCREMENT,
    	...
    );
    
  2. 修改表是设置标识列:

    1.设置标识列
    ALTER TABLE 表名 MODIFY COLUMN 列名 类型 约束 AUTO_INCREMENT;#约束看需求添加与否
    2.删除标识列
    ALTER TABLE 表名 MODIFY COLUMN 列名 类型 约束;
    

你可能感兴趣的:(mysql,数据库,mysql,sql)