目次
束缚范例:
一、not null(非空束缚):
二、default (默认束缚):
三、unique(唯一束缚):
四、primary key (主键束缚):
单个列主键:
多个列主键:
五、foreign key(外键束缚):
示例代码1:
示例代码2:
注意事项:
什么是数据库的束缚?
数据库束缚是关系型数据库(比如MYSQL)的一个紧张功能,紧张作用是包管数据的有用性,也可以明白为对数据的准确性举行校验。
束缚通常是在创建表时界说的,这是最常见的做法,在表计划阶段,预先规划束缚可以确保数据从一开始就符合完备性要求,克制后续脏数据的产生。这是最佳实践。
束缚范例:
| 范例 | 分析 | | not null(非空束缚) | 指定非空束缚的列不能存储 null 值 | | default (默认束缚) | 当没有给列赋值时使用的默认值 | | unique(唯一束缚) | 指定唯一束缚的列每行数据必须有唯一的值(不能重复,但可以为 null ) | | primary key (主键束缚) | not nul 和 unique 的联合,可以指定一个或多个列,有助于防止数据重复和进步数据的查询性能 | | foreign key(外键束缚) | 外键束缚是一种关系束缚,用于界说两个表之间的关联关系,可以确保数据的完备性和同等性 | | check(束缚) | 用于限定列或数据在数据库表中的值,确保数据的准确性和可靠性 |
一、not null(非空束缚):
界说表时某列不允许为 null 时,可以为列添加非空束缚。
假如我们规定门生的 名字 不能为 null :
- -- 定义一个学生表
- create table student(
- id bigint,
- name varchar(20) not null
- );
- -- 添加数据信息
- insert into student values (1, null);
复制代码
添加数据信息这条下令报错,由于门生名字不能为空
准确插入信息:
- -- 添加正确的学生信息
- insert into student values (1, '张三');
复制代码
二、default (默认束缚):
default 束缚用于向列中插入默认值,假如没有为列设置值,那么会将默认值设置到该列。
假如我们门生的 名字 写入时没有指定命据:
- -- 定义一个学生表
- drop table student;
- create table student(
- id bigint,
- name varchar(20) default '黑名单'
- );
- -- 插入第一个没有指定名字的学生
- insert into student (id) values (1);
- -- 插入第二个有指定名字的学生
- insert into student (id,name) values (2,'刘棋');
- -- 插入第一个没有指定名字的学生
- insert into student (id) values (3);
复制代码
可以看到,第一个和第三个我们没有指定门生的名字,就在设置了默认束缚的列加上了 我们创建表时设定的默认值。
三、unique(唯一束缚):
用于确保表中某一列值是唯一的,但允许有 null ,比如身份证。
假如我们规定门生的 id 不能 重复:
- -- 定义一个学生表
- drop table student;
- create table student(
- id bigint unique;
- name varchar(20)
- );
-
- -- 插入第一个学生数据
- insert into student values (1,'张三');
复制代码
再往内里插入雷同 id 的门生:
- insert into student values (1,'王五');
复制代码
可以看到,id 雷同的时间是不可的。
但是 id 可以为 null :
- -- id 为 null
- insert into student values (null,'王五');
- insert into student values (null,'王五');
- insert into student values (null,'李四');
复制代码
只加了 唯一束缚 的列可以写入多个 null 。
四、primary key (主键束缚):
1. 主键必须包罗唯一的值,且不能为 null (唯一且非空)。
2. 每个表只能有一个主键,可以有单个列 或 多个列构成。
3. 一个表只能有一个自增列。
剧烈发起每个表中都创建一个主键。
单个列主键:
比如我们创建一个门生表,门生的 id 每个人都是唯一的,且不为 null :
- create table student(
- id bigint primary key,
- name varchar(20)
- );
-
- -- 插入第一个学生信息
- insert into student (id,name) values (1,'张三');
-
- -- 插入第二个学生信息
- insert into student (id,name) values (2,'李四');
复制代码
假如插入的 id 不唯一 大概 为 null :
- -- id 相同
- insert into student (id,name) values (1,'李旺');
-
- -- id 为 null
- insert into student (id,name) values (null,'李凯');
复制代码
像这种情况是会报错的,以是,不能如许写。
通常我们把主键列设置为自动增长(auto_increment),让数据库维护主键值:
- -- 定义一个学生表
- drop table student;
- create table student(
- id bigint primary key auto_increment,
- name varchar(20)
- );
-
- -- 插入第一条学生信息
- insert into student (name) values ('张三');
- -- 插入第二条学生信息
- insert into student (name) values ('李四');
- -- 插入第三条学生信息
- insert into student (id,name) values (null,'王五');
复制代码
值得注意的是,插入第三个门生信息的时间,我们指定的 id 输入了 null,没有报错,由于在这里 id 是作为占位的存在,写入的 null 只起到占位的作用。
多个列主键:
比如我们想让门生的sno(门生编号)和 name (门生名字)作为主键,可以这么写:
- -- 定义一个学生表
- drop table student;
- create table student(
- sno varchar(20),
- name varchar(20),
- gender bool,
- primary key (sno,name)
- );
-
- -- 插入第一个学生信息
- insert into student (sno,name,gender) values (1,'张三',1);
-
- -- 插入第二个学生信息
- insert into student (sno,name,gender) values (2,'张三',1);
-
- -- 插入第三个学生信息
- insert into student (sno,name,gender) values (1,'李四',1);
复制代码 可以看到,当sno 和 name 不是全部雷同的时间,可以作为一条数据插入。
但是,如许就会报错:
- -- 插入第四个学生信息
- insert into student (sno,name,gender) values (1,'张三',10);
复制代码
由于当多个主键的值组合在一起时,会把当前多个列举行比力,假如主键列都分别雷同,就会报错。
再比如一个例子:
- CREATE TABLE orders (
- user_id INT,
- order_id INT,
- product_id INT,
- PRIMARY KEY (user_id, order_id) -- 复合主键
- );
复制代码
- 合法数据:(1001, 1, 10) 和 (1001, 2, 10)(user_id 和 order_id 的组合唯一)。
- 非法数据:插入两条 (1001, 1, 20) 会因主键重复报错。
实际应用场景:
场景:订单表
- 复合主键计划
- CREATE TABLE orders (
- user_id INT,
- order_id INT,
- product_id INT,
- PRIMARY KEY (user_id, order_id) -- 确保每个用户的订单ID唯一
- );
复制代码 - 数据库会克制插入 (1001, 1, 10) 和 (1001, 1, 20)(主键重复),但允许 (1001, 1, 10) 和 (1002, 1, 10)。
五、foreign key(外键束缚):
1. 外键用于界说主表和从表之间的关系。
2. 外键界说在从表列上,紧张关联的列必须是主键或唯一束缚。
3. 当界说外键后,要求从表中的外键列数据必须在主表的主键或唯一列存在或为 null 。
从表中使用了主表中的某个值,这个值必须要存在与主表中。
示例代码1:
- -- 定义一个班级表(主表)
- create table class (
- id bigint primary key auto_increment,
- name varchar(20) not null
- );
- -- 定义一个学生表(从表)
- create table student (
- id bigint primary key auto_increment,
- name varchar(20) not null,
- class_id bigint,
- foreign key (class_id) references class(id) -- 创建外键约束
- );
- -- 查看 student 表
- desc student;
复制代码
这表明 class_id 列有非唯一索引,由于它是外键。
示例代码2:
- create table orders (
- order_id INT PRIMARY KEY,
- order_date DATE,
- customer_id INT,
- foreign key (customer_id) references customers(customer_id)
- );
复制代码 上述代码在创建 “orders” 表时,界说了 “customer_id” 为列,通过 “foreign key” 关键字指定,并使用 “references” 关键字指定它引用 “customers” 表中的 “customer_id” 列。
外键束缚的注意事项:
数据同等性要求
1.父表的被引用列必须是 主键 或 唯一键。
2. 从表 的外键字段数据范例需与 主表 被引用列完全同等。
注意事项:
- -- 定义一个班级表(主表)
- create table class (
- id bigint primary key auto_increment,
- name varchar(20) not null
- );
- -- 定义一个学生表(从表)
- create table student (
- id bigint primary key auto_increment,
- name varchar(20) not null,
- class_id bigint,
- foreign key (class_id) references class(id) -- 创建外键约束
- );
- -- 查看 student 表
- desc student;
复制代码 当删除主表时假如从表中有对主表记载的引用,则不允许删除主表中对应的记载。
比如:
- -- 初始化 class 表
- insert into class (name) values ('美术班'), ('手工班'), ('数学班'), ('语文班'), ('英语班');
- -- 初始化 student 表
- insert into student values (1,'张三', 1), (2,'李四', 2),(3,'王五',2),(4,'李琦',5);
复制代码
然后对其举行删除主表的操纵:
- -- 删除数学班
- delete from class where id = 3;
- -- 删除英语班
- delete from class where id = 5;
复制代码
可以看到,数学班删除乐成了。
但是英语班由于从表 name = ‘李琦’ 尚有关联到这个主表的英语列,以是不能删除。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|