首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >数据库造神计划第十一天---数据库约束(2)

数据库造神计划第十一天---数据库约束(2)

作者头像
寻星探路
发布2025-12-17 19:11:43
发布2025-12-17 19:11:43
540
举报
文章被收录于专栏:CSDN博客CSDN博客

一、约束类型(续)

1、primary key主键约束

主键约束唯⼀标识数据库表中的每条记录。 主键必须包含唯⼀的值,且不能包含null值。 每个表只能有⼀个主键,可以由单个列或多个列组成。 通常为每张表都指定⼀个主键,主键列建议使用bigint类型。 相当于:unique + not null

1.1重构学生表

为id列添加非空和唯⼀约束

代码语言:javascript
复制
drop table student;
 
create table student (
    id bigint not null unique,
    name varchar(20) not null,
    age int DEFAULT 18,
    sno varchar(10) UNIQUE
);
1.2查看表结构

添加了非空和唯⼀约束之后Key列显示PRI表示主键

代码语言:javascript
复制
desc student;

当id列的重复时会发生主键冲突

代码语言:javascript
复制
insert into student(id, name, sno) values (1, '张三', '100001');
代码语言:javascript
复制
insert into student(id, name, sno) values (1, '李四', '100001');

通常把主键列设置为自动增长,让数据库维护主键值

代码语言:javascript
复制
drop table student;

# 重构学⽣表
create table student (
    id bigint PRIMARY KEY auto_increment,  # 设置⾃增主键
    name varchar(20) not null,
    age int DEFAULT 18,
    sno varchar(10) UNIQUE
);
1.3插入数据时不设置主键列的值
代码语言:javascript
复制
# 主键列的值为NULL
insert into student(id, name, sno) values (NULL, '张三', '100001');
代码语言:javascript
复制
# 不指定主键
insert into student(name, sno) values ('李四', '100002');
代码语言:javascript
复制
# 主键列的值⾃动⽣成
select * from student;
1.4查看表结构

Extra列显示auto_increment表示自增

代码语言:javascript
复制
desc student;
1.5如果某条记录写入失败,新生成的主键值将会作废
代码语言:javascript
复制
# 由于学号重复,产⽣了唯⼀冲突,导致插⼊失败,ID为3的主键值作废
insert into student(name, sno) values ('王五', '100002');
代码语言:javascript
复制
# 修改学号后成功插⼊数据
insert into student(name, sno) values ('王五', '100003');
代码语言:javascript
复制
# 查询后发现新记录ID列的值为4
select * from student;

#注:主键自增一次,数据库就记录了一个id的值,后续每次插入新的数据:id +1(作废的话也会被记录)

1.6主键值可以不连续
代码语言:javascript
复制
# ⼿动指定⼀个值
insert into student(id, name, sno) values (100, '赵六', '100004');

select * from student;
代码语言:javascript
复制
# 下⼀次⾃增从主键的最⼤值开始
insert into student(name, sno) values ('钱七', '100005');

select * from student;
1.7主键或唯⼀键冲突时要有更新操作,插入否则更新

语法:

代码语言:javascript
复制
INSERT ... ON DUPLICATE KEY UPDATE column = value [, column = value] ...
代码语言:javascript
复制
# 插⼊ID为100,学号为100100的学⽣记录时,报主键冲突
insert into student(id, name, sno) values (100, '赵六', '100100');
代码语言:javascript
复制
# 可以使⽤以上语法,如果插⼊时有冲突则更新当前列的值
insert into student(id, name, sno) values (100, '赵六', '100100') ON DUPLICATE KEY UPDATE name = '赵六', sno = '100100';
# 两⾏受影响,表⽰删除了原来的记录,⼜新写⼊了⼀条记录
# 与update student set name = '赵六',sno ='100100'whereid = 100; 等效
1.8替换,如果存在冲突则替换,不存在冲突则插入

语法:

代码语言:javascript
复制
REPLACE [INTO] table_name
    [(column [, column] ...)]
VALUES 
    (value_list) [, (value_list)] ...

value_list: value, [, value] ...
代码语言:javascript
复制
# 写⼊或更新Id为101的记录
REPLACE into student(id, name, sno) values (101, '钱七', '100101');
代码语言:javascript
复制
# 原数据已更新
select * from student;
代码语言:javascript
复制
# 写⼊⼀条新数据
REPLACE into student(id, name, sno) values (102, '吴⼋', '100102');
1.9表中不能有多个主键
代码语言:javascript
复制
drop table student;
# 重构学⽣表
create table student (
    id bigint PRIMARY KEY auto_increment,  # 定义主键
    name varchar(20) PRIMARY KEY           # 定义主键
);
1.10复合主键

由多个列共同组成的主键,主键是否冲突以多个列的组成进行判定

代码语言:javascript
复制
drop table student;
# 重构学⽣表
create table student (
    id bigint,
    name varchar(20),
    PRIMARY KEY (id, name)  # 指定复合主键
);

# 插⼊数据
insert into student(id, name) values (1, '张三');

# 重复插⼊主键冲突,此时主键值由id和name两个列共同决定
insert into student(id, name) values (1, '张三');
代码语言:javascript
复制
# 修改id值插⼊成功
insert into student(id, name) values (2, '张三');
代码语言:javascript
复制
select * from student;

由于内容较多,会分为多篇讲解,预知后续内容,请看后续博客!!!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-09-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、约束类型(续)
  • 1、primary key主键约束
    • 1.1重构学生表
    • 1.2查看表结构
    • 1.3插入数据时不设置主键列的值
    • 1.4查看表结构
    • 1.5如果某条记录写入失败,新生成的主键值将会作废
    • 1.6主键值可以不连续
    • 1.7主键或唯⼀键冲突时要有更新操作,插入否则更新
    • 1.8替换,如果存在冲突则替换,不存在冲突则插入
    • 1.9表中不能有多个主键
    • 1.10复合主键
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档