数据库束缚

[复制链接]
发表于 2025-10-20 22:33:58 | 显示全部楼层 |阅读模式
目次
束缚范例:
一、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
  1. -- 定义一个学生表
  2. create table student(
  3. id bigint,
  4. name varchar(20) not null
  5. );
  6. -- 添加数据信息
  7. insert into student values (1, null);
复制代码
 

添加数据信息这条下令报错,由于门生名字不能为空

准确插入信息:
  1. -- 添加正确的学生信息
  2. insert into student values (1, '张三');
复制代码




   二、default  (默认束缚):

  default 束缚用于向列中插入默认值,假如没有为列设置值,那么会将默认值设置到该列。
假如我们门生的 名字 写入时没有指定命据
  1. -- 定义一个学生表
  2. drop table student;
  3. create table student(
  4.   id bigint,
  5.   name varchar(20) default '黑名单'
  6. );
  7. -- 插入第一个没有指定名字的学生
  8. insert into student (id) values (1);
  9. -- 插入第二个有指定名字的学生
  10. insert into student (id,name) values (2,'刘棋');
  11. -- 插入第一个没有指定名字的学生
  12. insert into student (id) values (3);
复制代码
 

 可以看到,第一个和第三个我们没有指定门生的名字,就在设置了默认束缚的列加上了 我们创建表时设定的默认值。




   三、unique(唯一束缚):

  用于确保表中某一列值是唯一的,但允许有 null ,比如身份证。
假如我们规定门生的 id 不能 重复
  1. -- 定义一个学生表
  2. drop table student;
  3. create table student(
  4.   id bigint unique;
  5.   name varchar(20)
  6. );
  7. -- 插入第一个学生数据
  8. insert into student values (1,'张三');
复制代码

 再往内里插入雷同 id 的门生:
  1. insert into student values (1,'王五');
复制代码

 可以看到,id 雷同的时间是不可的。
但是 id 可以为 null
  1.   -- id 为 null
  2. insert into student values (null,'王五');
  3. insert into student values (null,'王五');
  4. insert into student values (null,'李四');
复制代码

 只加了 唯一束缚 的列可以写入多个 null 。




   四、primary key (主键束缚):

  1. 主键必须包罗唯一的值,且不能为 null (唯一且非空)。
2. 每个表只能有一个主键,可以有单个列 多个列构成。
3. 一个表只能有一个自增列。
剧烈发起每个表中都创建一个主键。


单个列主键:

比如我们创建一个门生表,门生的 id 每个人都是唯一的,且不为 null :
  1. create table student(
  2.   id bigint primary key,
  3.   name varchar(20)
  4. );
  5. -- 插入第一个学生信息
  6. insert into student (id,name) values (1,'张三');
  7. -- 插入第二个学生信息
  8. insert into student (id,name) values (2,'李四');
复制代码

假如插入的 id 不唯一 大概 为 null
  1. -- id 相同
  2. insert into student (id,name) values (1,'李旺');
  3.   
  4. -- id 为 null
  5. insert into student (id,name) values (null,'李凯');
复制代码
 
像这种情况是会报错的,以是,不能如许写。


通常我们把主键列设置为自动增长(auto_increment),让数据库维护主键值:
  1. -- 定义一个学生表
  2. drop table student;
  3. create table student(
  4.   id bigint primary key auto_increment,
  5.   name varchar(20)
  6. );
  7. -- 插入第一条学生信息
  8. insert into student (name) values ('张三');
  9. -- 插入第二条学生信息
  10. insert into student (name) values ('李四');
  11. -- 插入第三条学生信息
  12. insert into student (id,name) values (null,'王五');
复制代码

值得注意的是,插入第三个门生信息的时间,我们指定的 id 输入了 null,没有报错,由于在这里 id 是作为占位的存在,写入的 null 只起到占位的作用。



多个列主键:

比如我们想让门生的sno(门生编号) name (门生名字)作为主键,可以这么写:
  1. -- 定义一个学生表
  2. drop table student;
  3. create table student(
  4. sno varchar(20),
  5.   name varchar(20),
  6.   gender bool,
  7.   primary key (sno,name)
  8. );
  9. -- 插入第一个学生信息
  10. insert into student (sno,name,gender) values (1,'张三',1);
  11. -- 插入第二个学生信息
  12. insert into student (sno,name,gender) values (2,'张三',1);
  13. -- 插入第三个学生信息
  14. insert into student (sno,name,gender) values (1,'李四',1);
复制代码
可以看到,当sno 和 name 不是全部雷同的时间,可以作为一条数据插入。

但是,如许就会报错:
  1. -- 插入第四个学生信息
  2.   insert into student (sno,name,gender) values (1,'张三',10);
复制代码

 由于当多个主键的值组合在一起时,会把当前多个列举行比力,假如主键列都分别雷同,就会报错。

再比如一个例子:
  1. CREATE TABLE orders (
  2.     user_id INT,
  3.     order_id INT,
  4.     product_id INT,
  5.     PRIMARY KEY (user_id, order_id)  -- 复合主键
  6. );
复制代码


  • 合法数据:(1001, 1, 10) 和 (1001, 2, 10)(user_id 和 order_id 的组合唯一)。
  • 非法数据:插入两条 (1001, 1, 20) 会因主键重复报错。

实际应用场景:
场景:订单表


  • 复合主键计划
    1. CREATE TABLE orders (
    2.     user_id INT,
    3.     order_id INT,
    4.     product_id INT,
    5.     PRIMARY KEY (user_id, order_id)  -- 确保每个用户的订单ID唯一
    6. );
    复制代码
  • 数据库会克制插入 (1001, 1, 10) 和 (1001, 1, 20)(主键重复),但允许 (1001, 1, 10) 和 (1002, 1, 10)。



   五、foreign  key(外键束缚):

  1. 外键用于界说主表从表之间的关系。
2. 外键界说在从表列上,紧张关联的列必须是主键或唯一束缚。
3. 当界说外键后,要求从表中的外键列数据必须在主表的主键或唯一列存在或为 null 。

 从表中使用了主表中的某个值,这个值必须要存在与主表中。
示例代码1:

  1. -- 定义一个班级表(主表)
  2. create table class (
  3.   id bigint primary key auto_increment,
  4.   name varchar(20) not null
  5. );
  6. -- 定义一个学生表(从表)
  7. create table student (
  8.   id bigint primary key auto_increment,
  9.   name varchar(20) not null,
  10.   class_id bigint,
  11.   foreign key (class_id) references class(id) -- 创建外键约束
  12. );
  13. -- 查看 student 表
  14. desc student;
复制代码

 这表明 class_id 列有非唯一索引,由于它是外键。


示例代码2:

  1. create table orders (
  2.     order_id INT PRIMARY KEY,
  3.     order_date DATE,
  4.     customer_id INT,
  5.     foreign key (customer_id) references customers(customer_id)
  6. );
复制代码
上述代码在创建 “orders” 表时,界说了 “customer_id” 为列,通过 “foreign key” 关键字指定,并使用 “references” 关键字指定它引用 “customers” 表中的 “customer_id” 列。
外键束缚的注意事项:
 数据同等性要求
1.父表的被引用列必须是 主键 或 唯一键
2. 从表 的外键字段数据范例需与 主表 被引用列完全同等

注意事项:

  1. -- 定义一个班级表(主表)
  2. create table class (
  3.   id bigint primary key auto_increment,
  4.   name varchar(20) not null
  5. );
  6. -- 定义一个学生表(从表)
  7. create table student (
  8.   id bigint primary key auto_increment,
  9.   name varchar(20) not null,
  10.   class_id bigint,
  11.   foreign key (class_id) references class(id) -- 创建外键约束
  12. );
  13. -- 查看 student 表
  14. desc student;
复制代码
当删除主表时假如从表中有对主表记载的引用,则不允许删除主表中对应的记载。
比如:
  1. -- 初始化 class 表
  2. insert into class (name) values ('美术班'), ('手工班'), ('数学班'), ('语文班'), ('英语班');
  3. -- 初始化 student 表
  4. insert into student values (1,'张三', 1), (2,'李四', 2),(3,'王五',2),(4,'李琦',5);
复制代码
 
然后对其举行删除主表的操纵:
  1. -- 删除数学班
  2. delete from class where id = 3;
  3. -- 删除英语班
  4. delete from class where id = 5;
复制代码

可以看到,数学班删除乐成了。
但是英语班由于从表 name = ‘李琦’ 尚有关联到这个主表的英语列,以是不能删除。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表