首页
学习
活动
专区
圈层
工具
发布

mysql添加新主键

在MySQL中添加新的主键是一个常见的数据库操作,但需要谨慎处理,因为主键是表中唯一标识每一行数据的字段,且其值必须唯一且非空。以下是关于在MySQL中添加新主键的基础概念、步骤、注意事项以及可能遇到的问题和解决方法。

基础概念

主键(Primary Key):

  • 主键是表中的一个或多个字段,其值能唯一地标识表中的每一行。
  • 主键列的值不允许为空(NULL),且在整个表中必须是唯一的。
  • 一个表只能有一个主键,但这个主键可以由多个字段组成(复合主键)。

添加新主键的步骤

假设我们有一个名为 employees 的表,现在想要为其添加一个新的主键 employee_id。

  1. 创建表时指定主键: 如果是在创建表的时候添加主键,可以使用以下SQL语句:
  2. 创建表时指定主键: 如果是在创建表的时候添加主键,可以使用以下SQL语句:
  3. 向已有表添加主键: 如果表已经存在,可以使用 ALTER TABLE 语句来添加主键:
  4. 向已有表添加主键: 如果表已经存在,可以使用 ALTER TABLE 语句来添加主键:

注意事项

  • 唯一性检查:在添加主键之前,确保所选字段的值在整个表中是唯一的。
  • 数据完整性:添加主键可能会影响到表的数据完整性,特别是当表中已有重复值或空值时。
  • 索引:主键会自动创建一个唯一索引,这有助于提高查询效率。

可能遇到的问题及解决方法

问题1:无法添加主键,因为存在重复值

  • 原因:所选字段中存在重复的值。
  • 解决方法:
    • 删除重复的行。
    • 或者修改重复值为唯一值。
    • 使用 ALTER TABLE 语句时加上 IGNORE 选项(不推荐,因为它会删除重复的行):
    • 使用 ALTER TABLE 语句时加上 IGNORE 选项(不推荐,因为它会删除重复的行):

问题2:无法添加主键,因为存在空值

  • 原因:所选字段中有空值。
  • 解决方法:
    • 更新表,将空值替换为非空值。
    • 或者删除含有空值的行。

问题3:添加主键后查询变慢

  • 原因:新创建的主键索引可能需要一段时间来优化。
  • 解决方法:
    • 使用 ANALYZE TABLE 来更新表的统计信息:
    • 使用 ANALYZE TABLE 来更新表的统计信息:
    • 确保数据库服务器的硬件资源充足。

示例代码

假设我们有一个现有的 employees 表,现在想要为其添加一个新的主键 employee_id:

代码语言:txt
复制
-- 检查 employee_id 字段是否存在重复值或空值
SELECT employee_id, COUNT(*)
FROM employees
GROUP BY employee_id
HAVING COUNT(*) > 1 OR employee_id IS NULL;

-- 如果没有重复值和空值,可以安全地添加主键
ALTER TABLE employees ADD PRIMARY KEY (employee_id);

通过以上步骤和注意事项,可以在MySQL中成功添加新的主键,并确保数据库的完整性和性能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

新特性解读 | MySQL 8.0 GIPK 不可见主键

---- 一、前言 作为 MySQL DBA ,相信大家都经历过在复制模式下,如果没有主键,遇到 load data ,大事务,ddl 等有大量表数据行扫描的行为时,会带来严重的主从延迟,给数据库稳定性和数据一致性带来隐患...一句概况就是: 当开启GIPK模式后,MySQL 会在没有显示定义主键的InnoDB表上自动生成不可见的主键。 对于已经使用云RDS的朋友,可能很早就享受到云 RDS MySQL 提供的隐式主键特性。...2.3 关于 DDL 当开启 GIPK 特性时,MySQL 生成的主键不能更改,只能在 VISIBLE 和 INVISIBLE 之间进行切换。...必须显式增加一个新的主键然后再删除 GIPK master [localhost:22031]> alter table t3 drop PRIMARY KEY; ERROR 1235 (42000):.../8.0/en/invisible-columns.html 本文关键字:#8.0 新特性# #MySQL#

1.2K30
  • 新特性解读 | MySQL 8.0 GIPK 不可见主键

    一、前言 作为 MySQL DBA ,相信大家都经历过在复制模式下,如果没有主键,遇到 load data ,大事务,ddl 等有大量表数据行扫描的行为时,会带来严重的主从延迟,给数据库稳定性和数据一致性带来隐患...一句概况就是: 当开启GIPK模式后,MySQL 会在没有显示定义主键的InnoDB表上自动生成不可见的主键。 对于已经使用云RDS的朋友,可能很早就享受到云 RDS MySQL 提供的隐式主键特性。...2.3 关于 DDL 当开启 GIPK 特性时,MySQL 生成的主键不能更改,只能在 VISIBLE 和 INVISIBLE 之间进行切换。...必须显式增加一个新的主键然后再删除 GIPK master [localhost:22031]> alter table t3 drop PRIMARY KEY; ERROR 1235 (42000):...运(chu)维(li)经(gu)验(zhang)比较丰富 DBA 而言,MySQL 数据库稳定性深受无主键之苦,对于自建场景尤其是没有审核流程的公司而言,该特性能提升数据库系统稳定性和安全性。

    88221

    Mysql资料 主键

    表中的任何列都可以作为主键,只要它满足以下条件: 1、任何两行都不具有相同的主键值 2、每个行都必须具有一个主键值(主键列不允许NULL值) 除MySQL强制实施的规则外,应该坚持的几个普遍认为的最好习惯为...二.操作 创建表中添加自增主键: create table s1 (id int(11) AUTO_INCREMENT PRIMARY KEY ; 增加主键: ALTER TABLE s2 ADD PRIMARY...这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放,因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15.../16),则开辟一个新的页(节点) 1.如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。...2、.如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置: 此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉

    6.7K20

    MySQL的主键详解

    表中的任何列都可以作为主键,只要它满足以下主键值规则条件: 任两行不具相同的主键值 每行都必须具有一个主键值(主键列不允许NULL) 这里的规则是MySQL本身强制实施的。...除MySQL强制实施的规则外,还应该坚持的最佳实践: 不更新主键列中的值 不重用主键列的值 不在主键列中使用可能会更改的值 例如,如果使用一个名字作为主键以标识某个供应商,当该供应商合并和更改其 名字时...,必须更改这个主键) 联合主键 好处 可以直观的看到某个重复字段的记录条数 主键A跟主键B组成联合主键 主键A跟主键B的数据可以完全相同,联合就在于主键A跟主键B形成的联合主键是唯一的。...联合主键体现在多个表上,复合主键体现在一个表中的多个字段。 复合主键 主键通常定义在表的一列上,但这并不是必需的,也可使用多个列作为主键。...表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键 将多个字段设置为主键,形成复合主键,这多个字段联合标识唯一性,其中,某几个主键字段值出现重复是没有问题的,只要不是有多条记录的所有主键值完全一样

    8.1K20

    MySQL主键设计盘点

    最近在项目中用了UUID的方式生成主键,一开始只是想把这种UUID的方式生成主键记录下来,在查阅资料的过程中,又有了一些新的认识和思考。 主键定义 唯一标识表中每行的一个列(或一组列)称为主键。...主键设计和应用原则 除了满足MySQL强制实施的规则(主键不可重复;一行中主键不可为空)之外,主键的设计和应用应当还遵守以下公认的原则: 不更新主键列中的值; 不重用主键列的值; 不在主键列中使用可能会更改的值...3、ID作为主键时在特定的环境会存在一些问题,比如需要排序的时候——UUID是无序的。 4、MySQL官方有明确的建议主键要尽量越短越好,36个字符长度的UUID不符合要求。...关于MySQL 使用自增ID主键和UUID 作为主键的性能比较可以查看参考【8】。 结论: 1、uuid做主键适用于小规模分布式架构用。...结论: 用自建的id生成器做主键适用于大规模分布式架构 参考: 【1】:红心李 :MySQL主键设计 【2】:Uncle Nucky :MySQL数据库主键设计原则 【3】:ellis:设计套路:Mysql

    6.7K30

    MySQL 8 新特性之自增主键的持久化

    自增主键没有持久化是个比较早的bug,这点从其在官方bug网站的id号也可看出(https://bugs.MySQL.com/bug.php?id=199)。...-+ 3 rows in set (0.00 sec) 可以看到,新插入的null值分配的是3,按照重启前的操作逻辑,此处应该分配5啊。...SELECT MAX(ai_col) FROM table_name FOR UPDATE; MySQL 8.0的解决思路 将自增主键的计数器持久化到redo log中。...具体可参考:https://dev.mysql.com/worklog/task/?id=6204 因自增主键没有持久化而出现问题的常见场景: 1....业务将自增主键作为业务主键,同时,业务上又要求主键不能重复。 2. 数据会被归档。在归档的过程中有可能会产生主键冲突。 所以,强烈建议不要使用自增主键作为业务主键。

    1.1K10

    MySQL主键约束使用

    MySQL主键约束是一种用于确保表中每行数据的唯一性的限制。每个表只能有一个主键,它可以是一个或多个列。创建表时添加主键约束在创建表时添加主键约束,需要在列名后面添加关键字"PRIMARY KEY"。...在已经存在的表中添加主键约束如果已经存在一个表,但需要将某些列或字段添加主键约束,可以使用ALTER TABLE语句来修改表结构。...例如,以下是向已经存在的表中添加主键约束的示例:ALTER TABLE my_tableADD PRIMARY KEY (id);在上面的示例中,"id"列被指定为主键。...主键约束和自增列通常情况下,主键约束通常与自增列一起使用。自增列是指在插入新行时,自动为该行分配一个唯一的值。在MySQL中,可以使用AUTO_INCREMENT关键字来创建自增列。...例如,以下是一个创建自增列并添加主键约束的示例:CREATE TABLE my_table ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50)

    5.2K20

    MySQL为什么需要主键

    表中的任何列都可以作为主键,只要它满足以下条件:任何两行都不具有相同的主键值。每个行都必须具有一个主键值(主键列不允许NULL值)这里列出的条件是MySQL本身强制实施的。...除MySQL强制实施的规则外,应该坚持的几个普遍认为的最好习惯为:不更新主键列的值。不重用主键列的值。不在主键列中使用可能会更改的值。比如用用户邮箱当主键,但是用户可能更换邮箱。...因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15/16),则开辟一个新的页(节点)。...如果使用自增主键:每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。如下图所示:这样就会形成一个紧凑的索引结构,近似顺序填满。...如果使用非自增主键:由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置:此时MySQL不得不为了将新记录插到合适位置而移动数据。

    3.2K00

    Mysql:小主键,大问题

    本篇讲解 Mysql 的「主键」问题,从「为什么」的角度来了解 Mysql 主键相关的知识,并拓展到主键的生成方案问题。再也不怕被问到 Mysql 时只知道 CRUD 了。...这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录「按主键顺序存放」,因此每当有一条新的记录插入时,MySQL 会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB...默认为 15/16),则开辟一个新的页(节点)。...如果表使用自增主键,那么每次插入新的记录,记录就会「顺序添加」到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。这样就会形成一个「紧凑」的索引结构,近似顺序填满。...否则由于每次插入主键的值近似于随机,因此每次新记录都要被插到现有索引页的中间某个位置,MySQL 不得不为了将新记录插到合适位置而「移动数据」,如下图右侧所示,这样就造成了一定的开销。

    5.6K10

    大战MySQL主键及其操作

    简忆上次所学知识:MySQL的记录长度为65535个字节,而varchar是达不到它的理论长度的,NULL占用一个字节,text文本不占用记录长度,因为它本身就占据十个字节。...这里继续学习与MySQL列属性相关知识:关于主键的增,改,删。...主键 主键:primary key (一张表中最多只能有一个主键) 主键,简而言之为主要的键,一张表中只能有一个字段可以使用对应的键,用来约束该字段里面的数据,不能重复,被称之为主键 。...运行结果:PRI代表主键(大部分时候),NULL为no,即主键本身不为空 二.创建表的时候,在字段之后,可以使用primary key(主键字段列表)来创建(如果有多个字段作为主键,可以称之为复合主键...) not null comment '课程名字' )charset utf8; -- 添加的两种方法: 1:alter table my_pri3 modify course char(10) primary

    5.9K20

    MYSQL-主键(Primary Key)

    MySQL(本章节) PostgreSQL MongoDB Redis Etcd 主键是数据库表设计中最为重要的概念之一,它远不止是“唯一标识符”那么简单,尤其是在 MySQL 默认的 InnoDB 存储引擎中...不推荐/谨慎使用:UUID 缺点: 如果必须使用 UUID,可以考虑有序 UUID(如 MySQL 8.0 的 UUID_TO_BIN(... , 1))或将其作为业务键,另设一个自增 INT 作为主键...作为主键,每个二级索引的叶子节点都会存储主键值,这会显著增加索引大小。 随机性:插入新记录时,UUID 是随机的,无法保证顺序追加。...这会导致 InnoDB 不得不将新行插入到现有数据页的中间位置,造成页分裂,从而影响写入性能并产生碎片。 3. 复合主键 (Composite Primary Key) 主键可以由多个字段组合而成。...INT NOT NULL, PRIMARY KEY (order_id, product_id) -- 指定 (order_id, product_id) 为联合主键 ); 为已存在的表添加主键

    3K10

    MySQL中主键为0和主键自排约束的关系

    使用limit查看指定范围数据的时候这时候表就会是从0开始往下排的顺序,但是insert添加一行数据的时候反而是跟行数有关系,这时候又是按照从1开始往下排的顺序。...如果使用主键自排约束以前表里有0,再设置完主键自排以后所有的0又不会根据行数,而是直接按照自上而下的顺序从1开始排。...哪怕没加主键自排以前只有一个0,加了主键自排以后还是会变成1。   开始有0,增加主键自排约束,0依次变为1,2,3,4.......   ...开始没0,增加主键自排约束,新添加的主键是0的行会根据行数自行变化,注意这里是新添加的行,使用的是insert。   开始没0,把某个主键的数修改成0,这个0会直接在排好序了再在表里显示出来。...说得简单一点就是,增加主键自排约束后:    主键的值:修改成的0,可以存在,就是排个序。         新添加的0,不允许存在,要根据行号改变。

    6K30
    领券