引言
为啥需要主键?
因为无法确定身份信息,就拿人的公民身份证号码 如果某个人的名字相同,为啥需要身份证信息?
那是因为无法“确定我就是我 ”,这个是社会现象,比如说假设,钟璃是钟离的儿子 突然间去世 那么
医院如何知道,钟璃是钟离的儿子 最快的方式身份证 ? 还是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)