数据库约束详解
约束NOT NULL:非空约束,强制列不接受 NULL 值,约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。UNIQUE:唯一性约束,约束唯一标识数据库表中的每条记录,具有UNIQUE约束的列的值在这一列具有唯一性。PRIMARY KEY:主键约束,有自定义的UNIQUE和NOT NULL约束,并且每个表只有一个主键.FOREIGN KEY:外键约束,指向另一个
约束
- NOT NULL:非空约束,强制列不接受 NULL 值,约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。
- UNIQUE:唯一性约束,约束唯一标识数据库表中的每条记录,具有UNIQUE约束的列的值在这一列具有唯一性。
- PRIMARY KEY:主键约束,有自定义的UNIQUE和NOT NULL约束,并且每个表只有一个主键.
- FOREIGN KEY:外键约束,指向另一个表中的 UNIQUE(唯一约束的键)。
- CHECK:检查约束,用于限制列中的值的范围,如果对一个表定义 CHECK 约束,那么此约束会基于行中其他列的值在特定的列中对值进行限制。MySQL不支持。
- 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)
主键和唯一键的区别
- 主键一张表中只有一个,而唯一键可以有多个;
- 主键不允许为NULL,唯一键可以为NULL;
- 两者都可以组合,但不推荐
- 两者都保证唯一性
注意:
创建a表时需要b表的字段1作为a表的外键列,那么b就是主表,a就是从表;而且主表必须先存在,删除时要先删除从表才能删主表。
外键的特点
- 从表的外键列的类型和主表的关联列的类型要求一致或兼容;
- 主表的关联列必须是键,一般是唯一键或者主键;
- 插入数据时,先插入主表再插入从表,删除数据时,先删除从表再删除主表;
修改表时添加约束
列级约束语法
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=值】来设置步长;也可以通过手动插入值来设置起始值;
-
创建表时设置标识列;
语法格式:CREATE TABLE 表名( 列名 类型 约束 AUTO_INCREMENT, ... );
-
修改表是设置标识列:
1.设置标识列 ALTER TABLE 表名 MODIFY COLUMN 列名 类型 约束 AUTO_INCREMENT;#约束看需求添加与否 2.删除标识列 ALTER TABLE 表名 MODIFY COLUMN 列名 类型 约束;
更多推荐
所有评论(0)