Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645
主键约束可以看成是非空约束再加上唯一约束
也就是说设置为主键列,不能为空,不能重复
像一般用户编号是不可能重复的,也不可能为空的
-- 删除数据表
drop table member PURGE ;
-- 创建数据表
create table member(
mid NUMBER,
name VARCHAR2(20) NOT NULL,
CONSTRAINT pk_mid PRIMARY KEY(mid)
) ;
下面就测试一下这个主键约束的作用,首先向数据表中添加一行数据
insert into member(mid,name) values(1,'张三') ;
下面继续向该数据表中增加下面的数据 ,这行代码将主键内容设置为 null
insert into member(mid,name) values(null,'李四') ;
代码运行后,出现错误信息:“ORA-01400: 无法将 NULL 插入 ("SCOTT"."MEMBER"."MID")”。说明把 null 数据添加到主键字段中是不允许的
下面继续添加数据,这次添加的数据是主键信息重复
insert into member(mid,name) values(1,'李四') ;
代码运行后,出现错误信息:“ORA-00001: 违反唯一约束条件 (SCOTT.PK_MID)”
因为前面 mid字段已经有“1”这个值,现在新添加的记录的 mid 字段的值仍然是“1“,不符合主键唯一的限制
通过这两个错误信息就已经可以确定,主键就是两个约束的集合体,即非空约束和唯一约束
在绝大多数情况下,一张表只能够定义一个主键信息,当然,从 SQL 语法的角度来说是允许定义多个列为主键,这样的操作往往称为复合主键
如果是复合主键,则表示这若干个列的内容完全重复的时候才称为违反约束
-- 删除数据表
drop table member purge;
-- 创建数据表
create table member(
mid NUMBER ,
name VARCHAR2(20) ,
CONSTRAINT pk_mid PRIMARY KEY(mid,name)
) ;
此时将 mid 与 name 两个字段同时定义为主键,所以当两个字段完全重复时才表示违反约
insert into member(mid,name) values (1,'张三') ;
insert into member(mid,name) values (1,'李四') ;
insert into member(mid,name) values (2,'李四') ;
此时,mid 与 name 两个字段内容都重复才违反约束,只有一个字段内容重复不违反约束
数据库设计的第一原则:不要使用复合主键。即一张表就一个主键