SQL增加主键约束的条件

结论

常见认为设为主键的条件为:

  • 值唯一
  • 不含空值
    • 具体实施中会出现各种问题

添加主键约束的条件细则:

  • 值唯一
  • 数据中不含空值
  • 在定义时需要not null约束(使用check约束不行

验证实验

接下来我做了关于这个细则的验证实验:


设Student表中的列为:

  • Sno( char(5),状态)
  • Sname(varchar(10),null)
  • Sage(int,null)

建立Student表的sql语句为:

create table Student(
	Sno  char(5)
	Sname  varchar(10)
	Sage  int
)

目的:想将Sno设为Student的主键。
需要根据Sno的状态分类讨论

若Sno中无null值

alter table Student
add constraint PK1 primary key(sno)

结果:会报错,因为Sno只是目前暂时没有空值,但有含null值的可能性。因此需要Sno增加约束条件,消除其含null值的可能性
在这里插入图片描述
思路有两种,一种通过check约束限制Sno不含空值、一种在定义Sno时限制。

  • check约束限制
alter table student
add constraint C1 check(sno is not null)

在这里插入图片描述
成功添加check约束后再次尝试。发现仍然失败。这个方法行不通
在这里插入图片描述

  • 定义限制
    为保证实验的严谨,需要控制变量,先将刚刚的C1限制删除再进行定义限制。
alter table student
alter column sno char(5) not null

再尝试增加主键约束。发现成功添加

若Sno中含null值

数据中含null值当然无法设置主键约束。但是在这一节可以进一步的佐证,为什么仅满足check约束无法成功添加主键约束。

  • 尝试添加check约束限制
    会报错,因为当前表中sno已经有null值
alter table student 
add check(sno is not null)
  • 强制添加check约束
    通过增加with nocheck字段可以强制添加check约束。这样的效果是,不会去检查先前的空值,但会检查之后插入的元组
alter table student 
with nocheck add check(sno is not null)

因此,会出现列Sno,明明有not null的check约束,但数据中仍有null值的问题。故check约束并不能保证Sno值不为null的条件,也就不能成功添加主键约束。

相关推荐

  1. SQL联合

    2024-04-23 17:40:05       56 阅读
  2. SQL回显

    2024-04-23 17:40:05       25 阅读
  3. SQL常见约束及外约束删除更新行为

    2024-04-23 17:40:05       35 阅读
  4. SQL优化策略收录

    2024-04-23 17:40:05       39 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-23 17:40:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-23 17:40:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-23 17:40:05       82 阅读
  4. Python语言-面向对象

    2024-04-23 17:40:05       91 阅读

热门阅读

  1. conda install ensembl-vep vep -V 报错Compress/Zlib.pm

    2024-04-23 17:40:05       36 阅读
  2. android文件压缩与解压

    2024-04-23 17:40:05       41 阅读
  3. 前端汪的逆袭:从Excel表格到网页魔幻秀

    2024-04-23 17:40:05       36 阅读
  4. python常用高阶函数

    2024-04-23 17:40:05       35 阅读
  5. 管理情绪方法【你的观点“稳定”你的情绪】

    2024-04-23 17:40:05       32 阅读
  6. 富格林:戒备虚假套路保障安全

    2024-04-23 17:40:05       44 阅读
  7. C# 生成指定图片的缩略图

    2024-04-23 17:40:05       30 阅读
  8. Oracle和SQL Server区别

    2024-04-23 17:40:05       33 阅读