首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

增加新主键mysql

增加新主键MySQL

基础概念

在MySQL数据库中,主键(Primary Key)是用于唯一标识表中每一条记录的一个或多个字段。主键具有以下特性:

  1. 唯一性:主键的值必须是唯一的,不能有重复。
  2. 非空性:主键的值不能为空。
  3. 唯一索引:主键字段上会自动创建唯一索引。

相关优势

  • 数据完整性:通过主键可以确保数据的唯一性和完整性。
  • 快速查找:主键上的索引可以提高查询效率。
  • 表关系:主键常用于表与表之间的关系定义,如外键。

类型

MySQL中的主键类型主要有以下几种:

  1. 单字段主键:使用单个字段作为主键。
  2. 复合主键:使用多个字段组合成一个主键。
  3. 自增主键:使用自增字段作为主键,通常用于自动生成唯一标识。

应用场景

  • 用户表:用户的唯一标识通常使用主键来表示。
  • 订单表:每个订单都有一个唯一的订单号,可以用作主键。
  • 产品表:每个产品都有一个唯一的产品ID,可以用作主键。

增加新主键的步骤

假设我们有一个表 users,现在需要增加一个新的主键 user_id

  1. 创建表时指定主键
代码语言:txt
复制
CREATE TABLE users (
    user_id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE
);
  1. 修改现有表增加主键
代码语言:txt
复制
ALTER TABLE users ADD COLUMN user_id INT AUTO_INCREMENT PRIMARY KEY;

遇到的问题及解决方法

问题1:表中已有数据,增加主键时遇到冲突

如果表中已有数据,增加主键时可能会遇到数据冲突的问题。可以通过以下步骤解决:

  1. 备份数据:在进行任何修改之前,先备份数据。
代码语言:txt
复制
mysqldump -u username -p database_name users > users_backup.sql
  1. 删除现有主键(如果有)
代码语言:txt
复制
ALTER TABLE users DROP PRIMARY KEY;
  1. 添加新主键
代码语言:txt
复制
ALTER TABLE users ADD COLUMN user_id INT AUTO_INCREMENT PRIMARY KEY;
  1. 更新数据(如果有必要)
代码语言:txt
复制
UPDATE users SET user_id = (SELECT MAX(user_id) + 1 FROM users) WHERE user_id IS NULL;

问题2:主键冲突

如果新增的主键字段值与现有数据冲突,可以通过以下方法解决:

  1. 手动设置主键值
代码语言:txt
复制
UPDATE users SET user_id = (SELECT MAX(user_id) + 1 FROM users) WHERE id = 1;
  1. 删除冲突数据
代码语言:txt
复制
DELETE FROM users WHERE id = 1;

参考链接

通过以上步骤和方法,可以有效地在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#

85330

mysql 联合主键_Mysql 创建联合主键

Mysql 创建联合主键 2008年01月11日 星期五 下午 5:21 使用primary key (fieldlist) 比如: create table mytable ( aa int, bb...char(8), cc date, primary key (aa,bb ) ); aa,bb为联合主键 不知道是不是因为mysql(6.0)的版本问题,还是各版本都是这种情况,mysql中创建联合主键...TABLE t1( id … MySQL创建双主键 如下: CREATE TABLE `loginlog` ( `id` ) unsigned zerofill NOT NULL AUTO_INCREMENT...COMMENT ‘主键编号’, `IP` … mysql修改联合主键 参考 https://blog.csdn.net/BockSong/article/details/80933477 alter...涉及的知识点总结如下: One to One 映射关系 一对一单向外键(XML/Annotation) 一对一双向外键关联(XML/A … SQL Server中的联合主键、聚集索引、非聚集索引、mysql

8.3K20
  • 特性解读 | 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 数据库稳定性深受无主键之苦,对于自建场景尤其是没有审核流程的公司而言,该特性能提升数据库系统稳定性和安全性。

    52621

    mysql 主键自增语句_MySQL 自增主键

    自增主键最大值怎么取的?存放到哪里?...MySQL 5.7 及之前的版本,自增主键最大值会在启动(重启)后从数据库中取出放到内存: SELECT MAX(ai_col) FROM table_name FOR UPDATE; 这样获取是通过计算的...但是在充值之前,该账号被删除,然后服务器故障重启,重启后有人注册了一个账号。结果我的 100 万充到了他的新账号上。注册新账号的人以为是新手福利,笑嘻嘻。 如何解决单调性的问题?...从 MySQL 8.0 开始,自增主键最大值会在每次修改后写入到 redo log,并且在每个检查点写入引擎私有的系统表。 如果是正常重启,则读取系统表里的值。...参考文档 为什么 MySQL 的自增主键不单调也不连续 https://database.51cto.com/art/202004/614923.htm 《MySQL技术内幕——InnoDB存储引擎》

    10.8K10

    mysql联合主键

    1、hibernate配置联合主键 1.1 联合主键的好处: 联合主键的好处是不需要因为需要主键增加一个无用的主键列 1.2 联合主键的建表语句 CREATE TABLE `HTTP_TERMINAL_DETAIL_STATISTICS...即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的 “version” 字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。...version元素必须紧挨着id后面--> 3、mysql...-16 777 215字节 中等长度文本数据 LONGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据 LONGTEXT 0-4 294 967 295字节 极大文本数据 4、mysql...5、查询mysql指定数据库的表个数: SELECT COUNT( * ) FROM information_schema.tables WHERE TABLE_SCHEMA = ‘库名’; 发布者:

    4.1K20

    Mysql资料 主键

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

    3.8K20

    mysql主键自增策略_MySQL 自增主键机制

    自增主键:特指在自增列上定义的主键。 自增主键的优点是让主键索引保持递增顺序的插入,避免页分裂,索引更加紧凑。 1. 自增值保存在哪? 不同的存储引擎保存自增值的策略不一样; a....Innodb引擎,mysql5.7之前,自增值保存在内存中,而且不会持久化自增值。...每次重启后第一次打开表,都会去查找自增值的最大值max(id), 并设置表当前自增值为max(id) + 1; mysql8.0, 自增值变更记录在了redo log中,重启时依靠redo log恢复重启之前的值...为了减少自增id锁带来的性能影响,mysql不会修改回去之前的自增值; 4. 自增锁的优化 a....而对于批量插入数据的语句(select … insert,replace … select 和 load data 语句),MySQL 有一个批量申请自增 id 的策略(注:该策略是导致自增 id 不连续的第三种原因

    9.5K50

    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

    4.2K30

    MySQL主键详解

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

    4.9K20

    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. 数据会被归档。在归档的过程中有可能会产生主键冲突。 所以,强烈建议不要使用自增主键作为业务主键

    62110

    MySQL主键约束使用

    MySQL主键约束是一种用于确保表中每行数据的唯一性的限制。每个表只能有一个主键,它可以是一个或多个列。创建表时添加主键约束在创建表时添加主键约束,需要在列名后面添加关键字"PRIMARY KEY"。...在已经存在的表中添加主键约束如果已经存在一个表,但需要将某些列或字段添加主键约束,可以使用ALTER TABLE语句来修改表结构。...主键约束和自增列通常情况下,主键约束通常与自增列一起使用。自增列是指在插入行时,自动为该行分配一个唯一的值。在MySQL中,可以使用AUTO_INCREMENT关键字来创建自增列。...这意味着在插入数据时,无需提供"id"列的值,MySQL会自动为其分配一个唯一的值。示例假设有一个用户表,其中包含以下列:id、name和email。...以下是如何插入数据的示例:INSERT INTO users (name, email)VALUES ('John', 'john@example.com');在上面的示例中,"id"列是自增列,不需要手动提值,MySQL

    2.6K20

    Mysql:小主键,大问题

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

    3.8K10

    大战MySQL主键及其操作

    简忆上次所学知识:MySQL的记录长度为65535个字节,而varchar是达不到它的理论长度的,NULL占用一个字节,text文本不占用记录长度,因为它本身就占据十个字节。...这里继续学习与MySQL列属性相关知识:关于主键的增,改,删。...增加主键:SQL操作中有多种方式可以给表增加主键,大体上分为三种: 一.在创建表时,直接写在字段之后(优点:非常直接,缺点:只能使用一个字段作为主键) 相关语句: create table my_pril...'课程代码:01 + 0000', score tinyint unsigned default 60 comment '成绩', -- 增加主键限制:学号和课程号是对应的,具有唯一性 primary...删除主键 因为主键无法更新:所以只能先删除,再增加

    4.4K20
    领券