数据库-列的完整性约束-PRIMARY KEY -主键

引言

为啥需要主键
因为无法确定身份信息,就拿人的公民身份证号码 如果某个人的名字相同,为啥需要身份证信息?
那是因为无法“确定我就是我 ”,这个是社会现象,比如说假设,钟璃是钟离的儿子 突然间去世 那么
医院如何知道,钟璃是钟离的儿子 最快的方式身份证 ? 还是DNA认证,当然是身份证 为啥不是DNA认证麻烦呗,最快好几天,才能验证何必呢,所以身份证最快的 而且每个人身份证都不一样 找一样的根本不存在 以下是个人研究成果:公民身份证编号 - 哈希值 通过哈希值找到对应的个人信息 对应的钟离 :4xxxxxxxxxxxx - 98 -搜索结果 显示 再来根据身份证来 搜索户口 搜索结果- 查看 证明OK 你可以去准备一下 …通过这个例子 你看到了啥 嘿嘿 原神, 等等,逍遥风雨声 ,带刀归来 我的名字叫 枫原万叶 :海鸥桑不要再乱叫,我怎么本能玩起原神的梗!可能玩原神玩的, 哈哈 好了收回来 证明身份信息非常简单
,但难在实现 确保身份证是仅此一位 所以数据库出现了居然怎么难 我帮你们实现 ,你们只要用我的PRIMARY KEY 就行 他不可能存在相同的,因为存在就会认为是错误 我报错,只要哪怕存在一个错误,都不行 这位就像傲娇的“贵族”一样,只能说娇生惯养真是可怕1
PRIMARY KEY 形容成傲娇非常明确

PRIMARY KEY - 主键 实例

单字段主键

# 列的完整性约束 primary Key
 create  database primaryKeyStudy;

use primaryKeyStudy;

#原神玩家信息
create table GenshinImpactPlayerInfor(id int ,name varchar(64));

#插入 两条相同ID不同的玩家
insert into  GenshinImpactPlayerInfor values(1000000,"我是神里绫华...忠实粉丝");

insert into  GenshinImpactPlayerInfor values(1000000,"我是神里绫华的狗");

select * from GenshinImpactPlayerInfor;
#请问若没有主键作为唯一的标识修改(1000000,"我是神里绫华的狗" )玩家会影响 这位(1000000,"我是神里绫华...忠实粉丝"),玩家吗?


update GenshinImpactPlayerInfor set name ='小森' where id=1000000;
#Query OK, 2 rows affected (0.01 sec)
#Rows matched: 2  Changed: 2  Warnings: 0
# 答案如变 有没有发生变化呢 全改那么 如何防止这种情况发生 这就好比原神中的角色 前代草神 大慈树王
# 在世界树里面彻底没有了 让世界彻底遗忘我 唉 世界树就是现实的大数据 当然也可以认为数据库


#原神玩家信息
create table GenshinImpactPlayerInfor(id int primary key ,name varchar(64));


#插入 两条相同ID不同玩家
 insert into  GenshinImpactPlayerInfor values(1000000,"我是神里绫华的狗");

 #插入    相同的ID 检查是否有相同的
 insert into  GenshinImpactPlayerInfor values(1000000,"我是神里绫华...忠实粉丝");
 # ERROR 1062 (23000): Duplicate entry '1000000' for key 'genshinimpactplayerinfor.PRIMARY'
 # 错误1062(23000):键“genshinimpactplayerinfor”的重复条目“1000000”。主要的
 # genshinimpactplayerinfor 中插入或更新数据时,遇到了一个重复的主键值。具体来说,这个错误指出尝试插入或更新的记录中有一个字段的值为 '1000000',而这个值已经存在于该表的主键列中。

  insert into  GenshinImpactPlayerInfor values(1000001,"我是神里绫华...忠实粉丝");

# Query OK, 1 row affected (0.04 sec)
      
select * from GenshinImpactPlayerInfor;
/*
+---------+-------------------------+
| id      | name                    |
+---------+-------------------------+
| 1000000 | 我是神里绫华的狗        |
| 1000001 | 我是神里绫华...忠实粉丝 |
+---------+-------------------------+
*/

单字段主键用法

1-在创建直接写

#原神玩家信息
create table GenshinImpactPlayerInfor(id int primary key ,name varchar(64));


2- 后面追加

create table GenshinImpactPlayerInfor1(id int  ,name varchar(64),constraint UID_PK primary key(id))
;
constraint  我要使用约束 的交出名字 使用啥约束 primary key 主键(给那个成员做主键) 在只有一个为主键环境下 默认PRIMARY KEY (`id`) 可以使用show create table GenshinImpactPlayerInfor;查看所有的完整性约束

单字段主键整合

# 列的完整性约束 primary Key
 create  database primaryKeyStudy;

use primaryKeyStudy;

#原神玩家信息
create table GenshinImpactPlayerInfor(id int ,name varchar(64));

#插入 两条相同ID不同的玩家
insert into  GenshinImpactPlayerInfor values(1000000,"我是神里绫华...忠实粉丝");

insert into  GenshinImpactPlayerInfor values(1000000,"我是神里绫华的狗");

select * from GenshinImpactPlayerInfor;
#请问若没有主键作为唯一的标识修改(1000000,"我是神里绫华的狗" )玩家会影响 这位(1000000,"我是神里绫华...忠实粉丝"),玩家吗?


update GenshinImpactPlayerInfor set name ='小森' where id=1000000;
#Query OK, 2 rows affected (0.01 sec)
#Rows matched: 2  Changed: 2  Warnings: 0
# 答案如变 有没有发生变化呢 全改那么 如何防止这种情况发生 这就好比原神中的角色 前代草神 大慈树王
# 在世界树里面彻底没有了 让世界彻底遗忘我 唉 世界树就是现实的大数据 当然也可以认为数据库


#原神玩家信息
create table GenshinImpactPlayerInfor(id int primary key ,name varchar(64));


#插入 两条相同ID不同玩家
 insert into  GenshinImpactPlayerInfor values(1000000,"我是神里绫华的狗");

 #插入    相同的ID 检查是否有相同的
 insert into  GenshinImpactPlayerInfor values(1000000,"我是神里绫华...忠实粉丝");
 # ERROR 1062 (23000): Duplicate entry '1000000' for key 'genshinimpactplayerinfor.PRIMARY'
 # 错误1062(23000):键“genshinimpactplayerinfor”的重复条目“1000000”。主要的
 # genshinimpactplayerinfor 中插入或更新数据时,遇到了一个重复的主键值。具体来说,这个错误指出尝试插入或更新的记录中有一个字段的值为 '1000000',而这个值已经存在于该表的主键列中。

  insert into  GenshinImpactPlayerInfor values(1000001,"我是神里绫华...忠实粉丝");

# Query OK, 1 row affected (0.04 sec)
      
select * from GenshinImpactPlayerInfor;
/*
+---------+-------------------------+
| id      | name                    |
+---------+-------------------------+
| 1000000 | 我是神里绫华的狗        |
| 1000001 | 我是神里绫华...忠实粉丝 |
+---------+-------------------------+
*/


# primary key 第一种的方式
create table GenshinImpactPlayerInfor(id int primary key ,name varchar(64));

# primary key 第二种的方式

create table GenshinImpactPlayerInfor1(id int  ,name varchar(64),constraint UID_PK primary key(id));
Query OK, 0 rows affected (0.06 sec)

# 查看 表结构
 desc GenshinImpactPlayerInfor1; 
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | NO   | PRI | NULL    |       |
| name  | varchar(64) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

desc GenshinImpactPlayerInfor;    
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | NO   | PRI | NULL    |       |
| name  | varchar(64) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
# 可以看到 key是 PRI 并且键的约束也不能为空
# 就像 原神的国家 一样  蒙德若没有哪个少年组织的人民反抗高塔孤王 跟随的风之精灵怎么会继承王座 那位少年去世 利用王座的力量 成为魔神巴巴托斯  从此成为风神  

mysql> show  create table GenshinImpactPlayerInfor;
+--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table                    | Create Table
                 |
+--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GenshinImpactPlayerInfor | CREATE TABLE `genshinimpactplayerinfor` (
  `id` int NOT NULL,
  `name` varchar(64) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

# id PRIMARY KEY (`id`) ....
 
+---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table                     | Create Table
                   |
+---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GenshinImpactPlayerInfor1 | CREATE TABLE `genshinimpactplayerinfor1` (
  `id` int NOT NULL,
  `name` varchar(64) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
GenshinImpactPlayerInfor1 好像没有更改 哪个(`id`)
 # 在这里面 CONSTRAINT关键字用于定义一个约束,UID_PK是这个约束的名称,PRIMARY KEY指定了id字段是表的主键。主键用于唯一标识表中的每一行记录,确保每条记录的id值都是唯一的。
 

多字段主键

也就是两个可以一样但不同产品就有不同的一样
能想起来?


#多行表现

 /*也就是两个可以一样但不同产品就有不同的一样 
能想起来?那原神和永劫无间为例 - 原神中	胡桃 这个角色 ,永劫无间也有这个角色 都是cv 拥有古灵精怪的声音配音演员 :陶典
*/
mysql> create table GameCharacter(id int ,name varchar(64), types varchar(64),godname varchar(64) default null ,Cv VARCHAR(32), constraint  primary key(id,name,types));
Query OK, 0 rows affected (0.04 sec)

mysql>  # 编号 角色名称 类型 名称 神明  cv:角色声音
mysql> #查看创建表结构
mysql> show create table GameCharacter;
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table         | Create Table
                                                                                                             |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GameCharacter | CREATE TABLE `gamecharacter` (
  `id` int NOT NULL,
  `name` varchar(64) NOT NULL,
  `types` varchar(64) NOT NULL,
  `godname` varchar(64) DEFAULT NULL,
  `Cv` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`,`name`,`types`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>
mysql> desc  GameCharacter;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int         | NO   | PRI | NULL    |       |
| name    | varchar(64) | NO   | PRI | NULL    |       |
| types   | varchar(64) | NO   | PRI | NULL    |       |
| godname | varchar(64) | YES  |     | NULL    |       |
| Cv      | varchar(32) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

mysql> #插入数据
mysql> insert  into GameCharacter  values( 1,"安柏","原神",null,'蔡书瑾');
Query OK, 1 row affected (0.01 sec)

mysql> insert  into GameCharacter  values( 2,"凯亚","原神",null,'孙晔');
Query OK, 1 row affected (0.01 sec)

mysql> insert  into GameCharacter  values( 3,"丽莎","原神",null,'钟可');
Query OK, 1 row affected (0.01 sec)

mysql> insert  into GameCharacter  values( 4,"温迪","原神",'巴巴托斯','喵酱');
Query OK, 1 row affected (0.00 sec)

mysql> insert  into GameCharacter  values( 5,"迪卢特","原神",null,'马洋');
Query OK, 1 row affected (0.01 sec)

mysql> insert  into GameCharacter  values( 6,"刻晴","原神",null,'谢莹');
Query OK, 1 row affected (0.00 sec)

mysql> insert  into GameCharacter  values( 7,"钟离","原神",'摩拉克斯','彭博');
Query OK, 1 row affected (0.01 sec)

mysql> insert  into GameCharacter  values(8,"雷电将军","原神",'巴尔泽布','菊花花');
Query OK, 1 row affected (0.01 sec)

mysql> insert  into GameCharacter  values(9,"枫原万叶","原神",null,'斑马');
Query OK, 1 row affected (0.00 sec)

mysql> insert  into GameCharacter  values(10,"神里绫华","原神" ,null,'小n');
Query OK, 1 row affected (0.01 sec)

mysql> insert  into GameCharacter  values(11,"纳西妲","原神" ,'布耶尔','花玲');
Query OK, 1 row affected (0.00 sec)

mysql> insert  into GameCharacter  values(12,"艾尔海森","原神" ,null,'杨超然');
Query OK, 1 row affected (0.01 sec)

mysql> insert  into GameCharacter  values(13,"那维莱特","原神" ,null,'桑毓泽');
Query OK, 1 row affected (0.01 sec)

mysql> insert  into GameCharacter  values(14,"芙宁娜","原神" ,'芙卡洛斯','钱琛');
Query OK, 1 row affected (0.00 sec)

mysql> #查看所插入到表中数据      
mysql> select *from GameCharacter;
+----+----------+-------+----------+--------+
| id | name     | types | godname  | Cv     |
+----+----------+-------+----------+--------+
|  1 | 安柏     | 原神  | NULL     | 蔡书瑾 |
|  2 | 凯亚     | 原神  | NULL     | 孙晔   |
|  3 | 丽莎     | 原神  | NULL     | 钟可   |
|  4 | 温迪     | 原神  | 巴巴托斯 | 喵酱   |
|  5 | 迪卢特   | 原神  | NULL     | 马洋   |
|  6 | 刻晴     | 原神  | NULL     | 谢莹   |
|  7 | 钟离     | 原神  | 摩拉克斯 | 彭博   |
|  8 | 雷电将军 | 原神  | 巴尔泽布 | 菊花花 |
|  9 | 枫原万叶 | 原神  | NULL     | 斑马   |
| 10 | 神里绫华 | 原神  | NULL     | 小n    |
| 11 | 纳西妲   | 原神  | 布耶尔   | 花玲   |
| 12 | 艾尔海森 | 原神  | NULL     | 杨超然 |
| 13 | 那维莱特 | 原神  | NULL     | 桑毓泽 |
| 14 | 芙宁娜   | 原神  | 芙卡洛斯 | 钱琛   |
+----+----------+-------+----------+--------+
14 rows in set (0.00 sec)

mysql>  insert  into GameCharacter  values( 4,"温迪",'所罗门72魔神','巴巴托斯','无');
Query OK, 1 row affected (0.01 sec)

mysql> insert  into GameCharacter  values(14,"芙宁娜","原神" ,'芙卡洛斯','钱琛');
ERROR 1062 (23000): Duplicate entry '14-芙宁娜-原神' for key 'gamecharacter.PRIMARY'
mysql> #查看所插入到表中数据
mysql> select *from GameCharacter;
+----+----------+--------------+----------+--------+
| id | name     | types        | godname  | Cv     |
+----+----------+--------------+----------+--------+
|  1 | 安柏     | 原神         | NULL     | 蔡书瑾 |
|  2 | 凯亚     | 原神         | NULL     | 孙晔   |
|  3 | 丽莎     | 原神         | NULL     | 钟可   |
|  4 | 温迪     | 原神         | 巴巴托斯 | 喵酱   |
|  4 | 温迪     | 所罗门72魔神 | 巴巴托斯 ||
|  5 | 迪卢特   | 原神         | NULL     | 马洋   |
|  6 | 刻晴     | 原神         | NULL     | 谢莹   |
|  7 | 钟离     | 原神         | 摩拉克斯 | 彭博   |
|  8 | 雷电将军 | 原神         | 巴尔泽布 | 菊花花 |
|  9 | 枫原万叶 | 原神         | NULL     | 斑马   |
| 10 | 神里绫华 | 原神         | NULL     | 小n    |
| 11 | 纳西妲   | 原神         | 布耶尔   | 花玲   |
| 12 | 艾尔海森 | 原神         | NULL     | 杨超然 |
| 13 | 那维莱特 | 原神         | NULL     | 桑毓泽 |
| 14 | 芙宁娜   | 原神         | 芙卡洛斯 | 钱琛   |
+----+----------+--------------+----------+--------+
15 rows in set (0.00 sec)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小森程序员

若能帮助到你,小费自愿付费

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值