本博文源于mysql,对约束进行一系列实战练习,具体内容请点击,涉及:检查约束/主键/外键/默认值/非空/查看表中约束
约束的作用
解决数据冗余,一个信息存两遍。学术定义:解决数据的一致性与正确性
主键约束
设置主键格式
<字段名> <数据类型> PRIMARY KEY [默认值]
每个表只有一个主键,但可以有复合主键,所谓复合主键就是多列组合的主键
例子:在test_db数据库中创建tb_emp3数据表,其主键为id,格式如下表
字段名称 | 数据类型 | 备注 |
id | INT(11) | 员工编号 |
name | VARCHAR(25) | 员工名称 |
deptId | INT(11) | 所在部门编号 |
salary | FLOAT | 工资 |
如果大家没有这个数据库,直接用
CREATE DATABASE test_db;
创建,下面是对例题的解答
CREATE TABLE tb_emp3
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25),
-> deptId INT(11),
-> salary FLOAT
-> );
创建完列指定主键
格式
PRIMARY KEY [字段名]
例子:在test_db数据库中创建tb_emp4,使其主键为id
字段名称 | 数据类型 | 备注 |
id | INT(11) | 员工编号 |
name | VARCHAR(25) | 员工名称 |
deptId | INT(11) | 所在部门编号 |
salary | FLOAT | 工资 |
CREATE TABLE tb_emp4(id INT(11),
name VARCHAR(25),deptId INT(11),salary FLOAT,primary key(id));
设置复合主键
格式:
PRIMARY KEY [字段1、字段2、....、字段3]
例子:创建数据表tb_emp5,假设表中没有主键id,设置name与deptId为联合主键
字段名称 | 数据类型 | 备注 |
name | VARCHAR(25) | 员工名称 |
deptId | INT(11) | 所在部门编号 |
salary | FLOAT | 工资 |
CREATE TABLE tb_emp5(name VARCHAR(25),
deptId INT(11),salary FLOAT,primary key(name,deptId));
在修改表时添加主键约束
格式
ALTER TABLE <数据表名> ADD PRIMARY KEY(<列名>);
例子:创建无主键tb_emp2,并用ALTER修改id为主键
字段名称 | 数据类型 | 备注 |
id | INT(11) | 员工编号 |
name | VARCHAR(25) | 员工名称 |
deptId | INT(11) | 所在部门编号 |
salary | FLOAT | 工资 |
mysql> use test_db;
Database changed
mysql> create table tb_emp1
-> (
-> id INT(11),
-> name VARCHAR(25),
-> deptId INT(11),
-> salary FLOAT
-> );
更换主键
ALTER TABLE tb_emp2 ADD primary key(id);
大家在敲代码的时候忽略col3,这是我在这篇博文遗留下来的
mysql|表的(创建/修改/删除)[含实战练习] 这是博主上一篇写的博文。
外键约束
外键用来在两个表的数据之间建立连接的。
在创建表时设置外键约束
[CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,...]
REFERENCES <主表名> 主键列1 [,主键列2,...]
例子:外键约束关联到id
为做实验先创建这样一个表结构的一张表tb_dept1,在数据库test_db中哦!
字段名称 | 数据类型 | 备注 |
id | INT(11) | 部门编号 |
name | VARCHAR(22) | 部门名称 |
location | VARCHAR(22) | 部门位置 |
CREATE TABLE tb_dept1(id INT(11) PRIMARY KEY,
name VARCHAR(22) NOT NULL,location VARCHAR(50));
创建数据表tb_emp6,并在表tb_emp6上创建外键约束,让它的键deptId作为外键关联到表tb_dept1的主键id,下表为表结构
字段名称 | 数据类型 | 备注 |
id | INT(11) | 员工编号 |
name | VARCHAR(25) | 员工名称 |
deptId | INT(11) | 所在部门编号 |
salary | FLOAT | 工资 |
了解表结构,添加了名称为fk_emp_dept1的外键约束,外键名称为deptId,其依赖于表tb_dept1的主键id
CREATE TABLE tb_emp6(id INT(11) PRIMARY KEY,name VARCHAR(25),
deptId INT(11),salary FLOAT,
CONSTRAINT fk_emp_dept1 FOREIGN KEY(deptId) REFERENCES tb_dept1(id));
在修改表时添加外键约束
格式
ALTER TABLE <数据表名> ADD CONSTRAINT <索引名>
FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);
例子:修改数据表tb_emp2,将字段deptId设置为外键,与数据表tb_dept1的主键进行关联
mysql> ALTER TABLE tb_emp2
-> ADD CONSTRAINT fk_tb_dept1
-> FOREIGN KEY(deptId)
-> REFERENCES tb_dept1(id);
删除外键约束
格式
ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;
例子:删除数据表tb_emp2中的外键约束fk_tb_dept1
ALTER TABLE tb_emp2
-> DROP FOREIGN KEY fk_tb_dept1;
唯一约束
本身作用是可以确保一列或者几列不出现重复值。
在创建表时设置唯一约束
格式
<字段名> <数据类型> UNIQUE
例子:创建数据表tb_dept2格式如下,指定部门的名称唯一
字段名称 | 数据类型 | 备注 |
id | INT(11) | 部门编号 |
name | VARCHAR(22) | 部门名称 |
location | VARCHAR(50) | 部门位置 |
CREATE TABLE tb_dept2(id INT(11) PRIMARY KEY,
name VARCHAR(22) UNIQUE,location VARCHAR(50));
在修改表时添加唯一约束
ALTER TABLE <数据表名> ADD CONSTRAINT <唯一约束名> UNIQUE (<列名>);
例子:修改数据表tb_dept1,指定部门的名称唯一
ALTER TABLE tb_dept1 ADD CONSTRAINT unique_name UNIQUE(name);
删除唯一约束
格式
ALTER TABLE <表名> DROP INDEX <唯一约束名>;
例子:删除数据表tb_dept1中的唯一约束unique_name
ALTER TABLE tb_dept1 DROP INDEX unique_name;
检查约束
这个用于指定需要检查的限定条件
在创建表时设置检查约束
格式
CHECK (<检查约束>)
例子:在test_db数据库中创建tb_emp7数据表格式如下,要求salary字段值大于0且小于10000
字段名称 | 数据类型 | 备注 |
id | INT(11) | 员工编号 |
name | VARCHAR(25) | 员工名称 |
deptId | INT(11) | 所在部门编号 |
salary | FLOAT | 工资 |
CREATE TABLE tb_emp7(id INT(11) PRIMARY KEY,name VARCHAR(25),deptId INT(11),
salary FLOAT,CHECK(salary>0 and salary <100),
FOREIGN KEY(deptId) REFERENCES tb_dept1(id));
在修改表时添加检查约束
格式
ALTER TABLE tb_emp6 ADD CONSTRAINT <检查约束名> CHECK(<检查约束>)
例子:修改tb_emp7数据表,要求id字段值大于0
ALTER TABLE tb_emp7 ADD CONSTRAINT check_id CHECK(id>0);
删除检查约束
格式
ALTER TABLE <数据表名> DROP CONSTRAINT <检查约束名>;
默认值约束
换个名字叫叫,可以理解给字段设置默认值。
在创建表时设置默认值约束
格式
<字段名> <数据类型> DEFAULT <默认值>;
例子:创建数据表tb_dept3,指定部门位置默认为Beijing
字段名称 | 数据类型 | 备注 |
id | INT(11) | 部门编号 |
name | VARCHAR(22) | 部门名称 |
location | VARCHAR(50) | 部门位置 |
CREATE TABLE tb_dept3(id INT(11) PRIMARY KEY,
name VARCHAR(22),location VARCHAR(50) DEFAULT 'Beijing');
在修改表时添加默认值约束
格式
ALTER TABLE <数据表名> CHANGE COLUMN <字段名> <数据类型> DEFAULT <默认值>;
例子:修改数据表tb_dept3,将部门默认值改为Shanghai
ALTER TABLE tb_dept3
-> CHANGE COLUMN location
-> location VARCHAR(50) DEFAULT 'Shanghai';
删除默认值约束
格式
ALTER TABLE <数据表名>
CHANGE COLUMN <字段名> <字段名> <数据类型> DEFAULT NULL;
例子:修改数据表tb_dept3,将部门位置的默认值约束删除
ALTER TABLE tb_dept3 CHANGE COLUMN location location VARCHAR(50) DEFAULT NULL;
非空约束
创建表时设置非空约束
格式
<字段名> 数据类型 NOT NULL;
例子:创建数据表tb_dept4,指定部门名称不能为空
表格式:
字段名称 | 数据类型 | 备注 |
id | INT(11) | 部门编号 |
name | VARCHAR(22) | 部门名称 |
location | VARCHAR(50) | 部门位置 |
CREATE TABLE tb_dept4(id INT(11) PRIMARY KEY,
name VARCHAR(22) NOT NULL,location VARCHAR(50));
修改表时添加非空约束
格式
ALTER TABLE <数据表名>
CHANGE COLUMN <字段名>
<字段名> <数据类型> NOT NULL;
例子:修改数据表tb_dept4,指定部门位置不能为空
ALTER TABLE tb_dept4 CHANGE COLUMN location location VARCHAR(50) NOT NULL;
删除非空约束
格式
ALTER TABLE <数据表名>
CHANGE COLUMN <字段名> <字段名> <数据类型> NULL;
例子:修改数据表tb_dept4,指定部门位置非空约束删除
ALTER TABLE tb_dept4 CHANGE COLUMN location location VARCHAR(50) NULL;
查看表中的约束
格式SHOW CREATE TABLE (数据表名)\G;
在“删除外键约束”标题里介绍过来了,可以往上查看相应的命令