约束
约束
约束的作用
在MySQL中,各种完整性约束是数据库关系模式定义的一部分CREATE TABLE或ALERT TABLE来定义。一旦定义了完整性约束,MySQL服务器就会随时监测处于更新状态的数据库内容是否符合相关的完整性约束,从而保证数据的一致性与正确性。这样可以防止操作对数据库的意外破坏,也能提高完整性检测效率,还能减轻数据库编程人员的负担。
主键约束
主键约束即在表中定义一个主键来唯一确定表中每一行数据的标识符
- 每个表只能定义一个主键
- 主键必须标识表中的每一行,且不能为null,即表中不可能存在两行数据有相同的主键名
- 一个列名只能复合主键列表中一次
- 复合主键不能包含不必要的多余列
创建表时设置主键约束
<字段名> <数据类型> PRIMARY KEY [默认值]
#示例1
create table emp(
id int(11) PRIMARY KEY,
name varchar(25)
);
#示例2
create table emp(
id int(11),
name varchar(25),
PRIMARY KEY(id)
);
#查看表结构
DESC emp;
创建表时设置复合主键
PRIMARY KEY [字段1,字段2。。。。,字段n]
#示例1
create table emp(
deptid int(11),
name varchar(25),
salary FLOAT,
PRIMARY KEY(name,deptid)
);
#查看表结构
DESC emp;
在修改表时,添加主键约束
ALTER TABLE <数据表名> ADD PRIMARY KEY (<列名>);
#示例1
create table emp(
id int(11),
name varchar(25),
salary FLOAT
);
ALERT TABLE emp ADD PRIMARY KEY(id);
#查看表结构
DESC emp;
外键约束
外键用来在两个表的数据之间建立连接,它可以是一列或者多列,一个表可以有一个或多个外键。外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键的值必须等于另一个表中主键的某个值。
主表(父表):对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表。
从表(子表):对于两个具有关联关系的表而言,相关联字段中外键所在的表就是从表。
- 父表必须已经存在与数据库中,或者是当前正在创建的表。
- 必须为父表定义主键。
- 主键不能包含空值,但允许外键中出现空值。
- 在父表的表名后面指定列名或列名的组合。
- 外键中列的数目必须和父表的主键中列的数目相同。
- 外键中列的数据类型必须和父表主键中对应列的数据类型相同。
在创建表时设置外键约束
[CONSTARAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,。。。]
REFERENCES <主键名> 主键列1 [,主键列2。。。]
#示例
create table dept(
id int(11) PRIMARY KEY,
name varchar(20) not null,
location varchar(50)
);
create table emp(
id int(11) PRIMARY KEY,
name varchar(28),
deptId int(11),
CONSTARAINT fk_emp_dept
FOREIGH KEY(deptId) REFERENCES dept(id)
);
#查勘表结构
DESC emp;
在修改表时添加外键约束
ALTER TABLE <数据表名> ADD CONSTRAINT <索引名>
FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);
#示例
ALTER TABLE emp ADD CONSTRAINT fk_tb_dept1 FOREIGN KEY(deptId) REFERENCES dept(id);
#查看表结构
SHOW CREATE TABLE EMP\G;
删除外键约束
ALTER TABLE emp DROP FOREIGN KEY fk_tb_dept;
唯一约束
唯一约束要求该列唯一,允许为空,但只能出现一个空值。唯一约束可以确保一列或者几列不出现重复值。
在创建表时设置唯一约束
<字段名> <数据类型> UNIQUE
#示例
create table dept2(
id int(11) PRIMARY KEY,
name VARCHAR(22) UNIQUE,
lication VARCHAR(50)
);
#查看表结构
DESC dept2;
在修改表时添加唯一约束
ALTER TABLE <数据表名> ADD CONSTRAINT <唯一约束名> UNIQUE(<列名>);
#示例
ALTER TABLE dept1 ADD CONSTRAINT unique_name UNIQUE(name);
#查看表结构
DESC dept1;
删除唯一约束
ALTER TABLE <表名> DROP INDEX <唯一约束名>;
#示例
ALTER TABLE dept1 DROP INDEX unique_name;
#查看表结构
DESC dept1;
检查约束
CHECK约束可以通过CREATE TABLE或ALTER TABLE语句实现,根据用户实际的完整性要求来定义。他可以分别对列或表实施CHECK约束。
在创建表时设置检查约束
CHECK (<检查约束>)
#示例
create table emp(
id int(11) PRIMARY KEY,
name varchar(21),
deptId int(12),
salary FLOAT,
CHECK(salary>0 AND salary<100),
FOREIGN KEY(deptId) REFERENCES dept(id)
);
#查看表结构
DESC emp;
在修改表时添加检查约束
ALTER TABLE emp ADD CONSTRAINT <检查约束名> CHECK(<检查约束>)
#示例
ALTER TABLE emp ADD CONSTARINT check_id CHECK(id>0);
删除检查字段
ALTER TABLE <数据表名> DROP CONSTRAINT <检查约束名>;
默认约束
默认值约束指定某列的默认值
在创建表时设置默认值约束
<字段名> <数据类型> DEFAULT <默认值>
#示例
create table dept(
id int(11) PRIMARY KEY ,
name VARCHAR(20),
lication VARCHAR(30) DEFAULT 'BEIJING'
);
#查看表结构
DESC dept;
在修改表时添加默认约束
ALTER TABLE <数据表名> CHANGE COLUMN <字段名> <数据类型> DEFAULT <默认值>;
#示例
ALTER TABLE dept CHANGE COLUMN location
location VARCHAR(50) DEFAULT 'SHANGHAI';
#查看表结构
DESC dept;
删除默认值约束
ALTER TABLE <数据表名> CHANGE COLUMN <字段名> <字段名> <数据类型> DEFAULT NULL;
#示例
ALTER TABLE dept CHANGE COLUMN location
location VARCHAR(50) DEFAULT NULL;
#查看表结构
DESC dept;
非空约束
非空约束可以通过CREATE TABLE 或ALTER TABLE语句实现。在表中某个列的定义后加上关键字NOT NULL 作为限定词,来约束该列的取值不能为空。
- 非空约束指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错。
在创建表时设置非空约束
<字段名> <数据类型> NOT NULL;
#示例
create table dept(
id int(11) PRIMARY KEY,
name VARCHAR(22) NOT NULL,
location VARCHAR(50)
);
#查看表结构
DESC dept;
在修改表时添加非空约束
ALTER TABLE <数据表名> CHANGE COLUMN <字段名> <字段名> <字段类型> NOT NULL;
#示例
ALTER TABLE dept CHANGE COLUMN location
location VARCHAR(50) NOT NULL;
删除非空约束
ALTER TABLE <数据表名> CHANGE COLUMN <字段名> <字段名> <数据类型> NULL;
#示例
ALTER TABLE dept CHANGE COLUMN location
location VARCHAR(50) NULL;
#查看表结构
DESC dept;