约束的介绍
- 约束是一种限制,他通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性
约束的类型
- MySQL中常用的几种约束类型:
约束类型 | 非空约束 | 主键约束 | 唯一约束 | 默认约束 | 外键约束 |
---|---|---|---|---|---|
关键字 | NOT NULL | PRIMARY KEY | UNIQUE | DEFAULT | FOREIGN KEY |
NOT NULL : 被非空约束的列是不能为空的
PRIMARY KEY : 约束表中的一行,通过主键能准确定位到表中的一行数据,一个表只能有一个PRIMARY KEY,如果表中没有设置主键,而某些程序需要主键,MySQL将返回第一个没有任何NULL列的UNIQUE键,作为主键
UNIQUE:规定一张表当中,指定的一列的值不能有重复,每一个值都是唯一的
DEFAULT:当插入数据时,如果没有明确为字段赋值,自动赋予默认值
FOREIGN KEY:用来两个表的数据之间建立连接,可以确保两个数据表之间的完整性和一致性
非空约束
空值与非空
- NULL:字段值可以为空
- NOT NULL:字段值禁止为空
- 非空约束指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时,没有指定值,数据库系统会报错。
语法规则:
列名 数据类型 NOT NULL
创建表时添加非空约束
CREATE TABLE bookinfo(
book_id INT,
book_name VARCHAR(20) NOT NULL
);
创建时没有指定非空约束可以通过修改表为指定列添加非法空约束
CREATE TABLE bookinfo(
book_id INT,
book_name VARCHAR(20)
);
ALTER TABLE bookinfo MODIFY book_name VARCHAR(20) NOT NULL;
删除非空约束
ALTER TABLE bookinfo MODIFY book_name VARCHAR(20) [NULL];
主键约束
- 主键约束要求主键列的数据唯一,并且不允许为空,主键能够唯一地标识表中的一条记录
主键的类型
- 主键分为单字段主键和多字段联合主键
单子段主键 - 单子段主键是由一个字段(列)组成
在定义列的同时指定主键
列名 数据类型 PRIMARY KEY;
在列定义的后边指定主键
[CONSTRAINT <约束名> PRIMARY KEY (列名);
多字段联合主键(或者叫复合主键)
- 主键有多个字段(列)联合组成
PRIMARY KEY(字段1, 字段2,…字段n);
- 例:
CREATE TABLE borrowinfo(
book_id INT,
card_id CHAR(18),
PRIMARY KEY(book_id, card_id)
);
如果在创建表时没有指定主键,可以通过修改表为列添加主键
CREATE TABLE bookinfo(
book_id INT,
book_name VARCHAR(20) NOT UNLL
);
有三种方式:
- ALTER TABLE bookinfo MODIFY book_id INT PRIMARY KEY;
- ALTER TABLE bookinfo ADD PRIMARY KEY(book_id);
- ALTER TABLE bookinfo ADD CONSTRAIN PK_ID PRIMARY KEY(book_id);
删除主键
ALTER TABLE bookinfo DROP PRIMARY KEY;
唯一约束
- 唯一约束要求该列唯一,允许为空,唯一约束可以确保一列或者几列不出现重复值
- 语法规则如下:
定义完列之后直接指定唯一约束
列名 数据类型 UNIQUE
定义完所有列之后指定唯一约束
[CONSTRAINT <约束名>] UNIQUE(<列名>)
- 创建表时添加唯一约束
create table bookinfo(
book_id INT PRIMARY KEY,
book_name varchar(20) UNIQUE NOT NULL
);
或者:
create table bookinfo(
book_id INT PRIMARY KEY,
book_name VARCHAR(20) NOT NULL,
CONSTRINT uk_bname UNIQUE(book_name)
);
如果创建表时没有指定唯一约束,可以通过修改表添加唯一约束
1、ALTER TABLE bookinfo MODIFY book_name varchar(20) UNIQUE;
2、ALTER TABLE bookinfo ADD UNIQUE(book_name);
3、ALTER TABLE bookinfo ADD CONSTRAINT uk_name UNIQUE(book_name);
删除唯一约束
ALTER TABLE bookinfo DROP INDEX uk_bname
ALTER TABLE bookinfo DROOP KEY uk_bname
唯一约束和主键约束的区别
- 一个表中可以有多个UNIQUE声明,但只能有一个PRIMARY KEY声明
- 声明为PRIMARY KEY的列不允许有空值
- 但是声明为UNIQUE的列允许有空值
默认约束
- 默认约束指定某列的默认值
- 语法规则:
列名 数据类型 DEFAULT 默认值
创建表时添加约束
REATE TABLE bookinfo(
book_id INT PRIMARY KEY,
press VARCHAR(20) DEFAULT “哈哈哈出版社”
);
创建表时没有添加默认约束,可以通过修改表添加约束
1、ALTER TABLE bookinfo MODIFY press VARCHAR(10) DEFAULT “哈哈哈出版社”;
2、ALTER TABLE bookinfo ALTER COLUMN press SET DEFAULT “哈哈哈出版社”;
删除约束
1、ALTER TABLE bookinfo MODIFY press VARCHAR(20);
2、ALTER TABLE bookinfo ALTER COLUMN press DROP DEFAULT;
外键约束
- 外键用来在两个表的数据之间建立链接,它可以是一列或者多列,一个表可以有一个或多个外键
- 外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键值必须等于另一个表中主键的某个值
- 外键的作用是保持数据的一致性,完整性
- 语法格式:
[CONSTRAINT <外键约束名>] FOREIGN KEY (列名) refernces <主键名> (主键);
创建表时添加外键约束
CREATE TABLE bookcategory(
category_id INT PRIMARY KEY,
category VARCHAR(20)
);
CREATE TABLE bookinfo(
book_id INT PRIMARY KEY,
book_category_id INT,
CONSTRAINT fk_cid FOREIGN KEY(book_category_id) REFERENCES bookcategory(category_id)
);
创建表时没有创建外键,可以通过修改表添加外键约束
ALTER TABLE bookinfo ADD FOREIGN KEY(book_category_id) REFERENCES bookcategory(category_id);
删除外键约束
ALTER TABLE bookinfo DROP FOREIGN KEY 外键约束名称fk_cid;
外键约束的参照操作
- CASCADE:从父表删除或更新且自动删除或更新子表中匹配的行
CREATE TABLE bookinfo(
book_id INT PRIMARY KEY,
book_category_id INT,
CONSTRAINT fk_cid FOREIGN KEY(book_category_id) REFERENCES bookcategory(category_id) ON DELETE CASCADE
);