本文章主要介绍SQL数据库的设计理念。针对存在事务型操作,多个数据库表格之间存在关联的,则建议使用SQL数据库。
首先,简单从键(字段)的规范开始,这对于数据库的设计有着至关重要的作用。
1. 简单介绍–键值的约束
MySQL数据库中存在以下几类重要的约束类型:
约束名称 | 描述 | 关键字 |
---|---|---|
非空约束 | 保证列中所有数据不能有NULL | NOT NULL |
唯一约束 | 保证列中所有数据各不相同 | UNIQUE |
主键约束 | 唯一标识 | PRIMARY KEY |
默认约束 | 采用默认值 | DEFAULT |
检查约束 | 保证列中值满足某一条件 | CHECK |
外键约束 | 建立两个表之间的链接 | FOREIGN KEY |
建立示例数据表
# 在DB1数据库中创建示例数据表table1
CREATE TABLE table1 (
id int primary key,
ename varchar(50) not null unique,
joindate date not null,
salary double(7,2) not null,
bonus double(7,2) not null default 0
);
#演示主键约束:非空且唯一
# 主键约束:非空且唯一
INSERT INTO table1(id,ename,joindate,salary,bonus) VALUES(1,'张三','1999-01-01',8800,1000);
INSERT INTO table1(id,ename,joindate,salary,bonus) VALUES(1,'李四','1992-01-01',8100,2000);
#演示非空约束
# 非空约束
INSERT INTO table1(id,ename,joindate,bonus) VALUES(3,'王五','1995-01-01',1000);
#演示唯一约束
# 唯一约束
INSERT INTO table1(id,ename,joindate,salary,bonus) VALUES(4,'张三','1994-01-01',4100,2000);
#演示默认约束
# 唯一约束
INSERT INTO table1(id,ename,joindate,salary) VALUES(4,'赵六','1994-01-01',4100);
# 显示插入的数据
select * from table1;
我们可以发现,由于没有设置bonus的值,因而其有一个默认值:0.
#演示默认约束
# 唯一约束
INSERT INTO table1(id,ename,joindate,salary) VALUES(4,'赵六','1994-01-01',4100);
# 显示插入的数据
select * from table1;
对于主键,若不想在写入数据的时候,避免由于在写入数据的时候,还要保证唯一的麻烦,可以给主键设置auto_increment使其不需要额外再插入该值,其在写入数据的时候,会自动增加1(只适用于整数类型数据列)。
# 先删除原来的数据表
drop table table1;
# 在DB1数据库中创建示例数据表table1
CREATE TABLE table1 (
id int primary key auto_increment,
ename varchar(50) not null unique,
joindate date not null,
salary double(7,2) not null,
bonus double(7,2) not null default 0
);
这时,我们再来插入数据,就不需要额外管id的值
# 插入两条数据
INSERT INTO table1(ename,joindate,salary,bonus) VALUES('张三','1999-01-01',8800,1000);
INSERT INTO table1(ename,joindate,salary,bonus) VALUES('李四','1992-01-01',8100,2000);
我们可以发现,在插入数据的同时,数据库会自动在id列上自增1。
下面,我们来学习一下外键,外键是两个设置多个表之间存在关联的必要条目,以此来保证数据的一致性和完整性。
首先,我们先创建两个数据表:员工表(emp)和部门表(dept)。在创建表的时候,要明确哪个表是主表,那些表则是从表,对于从表中的引用主表的键,则需要使用外键约束。(注意:若想使用外键,需要特定的引擎支持:InnoDB,此外,还需要开启选项:FOREIGN_KEY_CHECKS;)
# 开启外键检测
SET FOREIGN_KEY_CHECKS=1;
# 关闭外键检测
SET FOREIGN_KEY_CHECKS=0;
# 查看外键检测
SELECT @@FOREIGN_KEY_CHECKS;
# 创建从表时添加外键约束
CREATE TABLE 从表名(
列名 数据类型,
[CONSTRAINT] [外键名称] FOREIGN KEY(外键列名) REFERENCES 主表(主表列名)
);
# 另外,也可以在创建表后,将某一键设置为外键
ALTER TABLE 表名 CONSTRAINT 外键名称 FOREIGN KEY (外键列名) REFERENCES 主表(主表列名);
# 创建部门表
CREATE TABLE dept(
id int primary key auto_increment,
name varchar(20) not null unique,
address varchar(20) not null
);
# 创建员工表
CREATE TABLE emp(
id int primary key auto_increment,
name varchar(20) not null unique,
age int not null,
dept_id int,
CONSTRAINT ky_emp_dept FOREIGN KEY (dept_id) REFERENCES dept(id)
);
ALTER TABLE emp add CONSTRAINT ky_emp_dept FOREIGN KEY (dept_id) REFERENCES dept(id);
# 先添加主表数据(部门)
INSERT INTO dept(name,address) VALUES('宣传部','北京市');
INSERT INTO dept(name,address) VALUES('政法部','北京市');
# 后添加员工数据
INSERT INTO emp(name,age,dept_id) VALUES('张三',20,1);
INSERT INTO emp(name,age,dept_id) VALUES('李四',23,2);
INSERT INTO emp(name,age,dept_id) VALUES('王五',23,3);
当使用外键时,必须先在主表中插入对应的条目,才能在从表中插入对应的数据,否则,就会出现上述的错误(因为不存在编号id为3的部门,因而在员工表中插入数据时,就会出现错误)。