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

mysql 增加主键语句

在MySQL中,增加主键通常是为了确保表中的每一行都有一个唯一的标识符,这有助于提高查询效率和数据完整性。以下是增加主键的语句及其相关概念:

增加主键的语句

假设我们有一个名为 students 的表,它目前没有主键,我们可以使用以下语句来添加一个名为 id 的主键:

代码语言:txt
复制
ALTER TABLE students ADD PRIMARY KEY (id);

如果 id 列已经存在,这将会设置 id 列为主键。如果 id 列不存在,你需要先创建这个列,例如:

代码语言:txt
复制
ALTER TABLE students ADD COLUMN id INT AUTO_INCREMENT;
ALTER TABLE students ADD PRIMARY KEY (id);

基础概念

  • 主键(Primary Key):数据库表中一列或多列的组合,其值能唯一地标识表中的每一行。
  • 自动递增(AUTO_INCREMENT):MySQL中的一个属性,允许列的值在每次插入新记录时自动增加。

相关优势

  • 唯一性保证:主键确保表中的每一行都有一个唯一的标识符。
  • 索引加速:主键默认会被创建为一个唯一索引,这有助于加快查询速度。
  • 数据完整性:通过强制唯一性,主键有助于维护数据的完整性。

类型

  • 单列主键:表中只有一列作为主键。
  • 复合主键:表中有两列或多列组合起来作为主键。

应用场景

  • 用户表:每个用户都有一个唯一的用户ID。
  • 订单表:每个订单都有一个唯一的订单号。

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

问题:尝试添加主键时出现错误

代码语言:txt
复制
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

原因:尝试添加的主键值已经存在。

解决方法:确保要设置为主键的列中没有重复的值,或者删除重复的行后再尝试添加主键。

问题:主键列的数据类型不支持自增

原因:尝试将非数值类型的列设置为自增主键。

解决方法:使用支持自增属性的数据类型,如 INTBIGINT

问题:表中已有数据,添加主键时遇到约束冲突

原因:表中已有的数据与新设置的主键约束冲突。

解决方法:在添加主键之前,先删除或更新那些违反主键约束的数据。

参考链接

在处理数据库相关的问题时,确保你有足够的权限,并且在进行任何结构性更改之前备份你的数据。

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

相关·内容

Mysql资料 主键

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

6.6K20
  • MySQL主键设计盘点

    主键设计和应用原则 除了满足MySQL强制实施的规则(主键不可重复;一行中主键不可为空)之外,主键的设计和应用应当还遵守以下公认的原则: 不更新主键列中的值; 不重用主键列的值; 不在主键列中使用可能会更改的值...3、ID作为主键时在特定的环境会存在一些问题,比如需要排序的时候——UUID是无序的。 4、MySQL官方有明确的建议主键要尽量越短越好,36个字符长度的UUID不符合要求。...5、对MySQL索引不利:作为数据库主键,在InnoDB引擎下,UUID的无序性可能会引起数据位置频繁变动,严重影响性能。...关于MySQL 使用自增ID主键和UUID 作为主键的性能比较可以查看参考【8】。 结论: 1、uuid做主键适用于小规模分布式架构用。...结论: 用自建的id生成器做主键适用于大规模分布式架构 参考: 【1】:红心李 :MySQL主键设计 【2】:Uncle Nucky :MySQL数据库主键设计原则 【3】:ellis:设计套路:Mysql

    6.5K30

    MySQL的主键详解

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

    7.9K20

    MySQL主键约束使用

    MySQL主键约束是一种用于确保表中每行数据的唯一性的限制。每个表只能有一个主键,它可以是一个或多个列。创建表时添加主键约束在创建表时添加主键约束,需要在列名后面添加关键字"PRIMARY KEY"。...在已经存在的表中添加主键约束如果已经存在一个表,但需要将某些列或字段添加主键约束,可以使用ALTER TABLE语句来修改表结构。...主键约束和自增列通常情况下,主键约束通常与自增列一起使用。自增列是指在插入新行时,自动为该行分配一个唯一的值。在MySQL中,可以使用AUTO_INCREMENT关键字来创建自增列。...如果要更新用户的信息,可以使用UPDATE语句。...如果要删除用户,可以使用DELETE语句。

    5.1K20

    MySQL为什么需要主键

    MySQL为什么需要主键主键表中每一行都应该有可以唯一标识自己的一列(或一组列)。一个顾客可以使用顾客编号列,而订单可以使用订单ID,雇员可以使用雇员ID或雇员社会保险号。...表中的任何列都可以作为主键,只要它满足以下条件:任何两行都不具有相同的主键值。每个行都必须具有一个主键值(主键列不允许NULL值)这里列出的条件是MySQL本身强制实施的。...除MySQL强制实施的规则外,应该坚持的几个普遍认为的最好习惯为:不更新主键列的值。不重用主键列的值。不在主键列中使用可能会更改的值。比如用用户邮箱当主键,但是用户可能更换邮箱。...由于每次插入时也不需要移动已有数据,因此效率很高,也不会增加很多开销在维护索引上。...这增加了很多开销,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面。

    2.9K00

    Mysql:小主键,大问题

    本篇讲解 Mysql 的「主键」问题,从「为什么」的角度来了解 Mysql 主键相关的知识,并拓展到主键的生成方案问题。再也不怕被问到 Mysql 时只知道 CRUD 了。...由于每次插入时也不需要移动已有数据,因此效率很高,也不会增加很多开销在维护索引上,如下图左侧所示。...由于此,Mysql 为维护索引可能需要频繁的刷新缓冲,增加了方法磁盘 IO 的次数,而且时常需要对索引结构进行重组织。 ?...数据库的实现 Mysql 自增 Mysql 在内存中维护一个「自增计数器」,每次访问 auto-increment 计数器的时候, InnoDB 都会加上一个名为「AUTO-INC 锁」直到该语句结束(...注意锁只持有到语句结束,不是事务结束)。

    5.5K10

    大战MySQL主键及其操作

    简忆上次所学知识:MySQL的记录长度为65535个字节,而varchar是达不到它的理论长度的,NULL占用一个字节,text文本不占用记录长度,因为它本身就占据十个字节。...这里继续学习与MySQL列属性相关知识:关于主键的增,改,删。...增加主键:SQL操作中有多种方式可以给表增加主键,大体上分为三种: 一.在创建表时,直接写在字段之后(优点:非常直接,缺点:只能使用一个字段作为主键) 相关语句: create table my_pril...删除主键 因为主键无法更新:所以只能先删除,再增加。...语句示例:alter table 表名 drop primary key; 相关语句: 删除主键 alter table my_pri3 drop primary key; 执行后查看删除信息: ?

    5.8K20

    MYSQL-主键(Primary Key)

    MySQL(本章节) PostgreSQL MongoDB Redis Etcd 主键是数据库表设计中最为重要的概念之一,它远不止是“唯一标识符”那么简单,尤其是在 MySQL 默认的 InnoDB 存储引擎中...二、主键的核心特性 唯一性 (Unique),主键值在整个表中必须是唯一的,任意两行都不能拥有相同的主键值。 非空性 (Not Null),主键字段不能为空(NULL)。...不推荐/谨慎使用:UUID 缺点: 如果必须使用 UUID,可以考虑有序 UUID(如 MySQL 8.0 的 UUID_TO_BIN(... , 1))或将其作为业务键,另设一个自增 INT 作为主键...作为主键,每个二级索引的叶子节点都会存储主键值,这会显著增加索引大小。 随机性:插入新记录时,UUID 是随机的,无法保证顺序追加。...mysql> SHOW CREATE TABLE test_data; +-----------+----------------------------------------------------

    2.6K10

    【MySQL 系列】MySQL 语句篇_DML 语句

    [WHERE clause]; 2、MySQL 中 的 DML 语句详解 2.1、DML语句:INSERT 在 MySQL 中,INSERT 语句用于将一行或者多行数据插入到数据表的指定列中。...FROM source_table [WHERE condition]; 语句说明:① 增加表中列的数目要与查询表中列的数目一致,列的类型也要相同;② 查询的表可以通过 WHERE 子句进行过滤;③ SELECT...的第一个列,对应着增加的第一个列,以此类推。...2.2.3、使用 UPDATE 修饰符 在 MySQL 中, UPDATE 语句支持 2 个修饰符: LOW_PRIORITY: 如果你指定了 LOW_PRIORITY 修饰符,MySQL 服务器将延迟执行...REPLACE 语句和 INSERT 语句很像,它们的不同之处在于,当插入过程中出现了重复的主键或者重复的唯一索引的时候,INSERT 语句会产生一个错误,而 REPLACE 语句则先删除旧的行,再插入新的行

    3.9K10

    【MySQL 系列】MySQL 语句篇_DDL 语句

    该列的值从 1 开始,每增加一个行就会加 1。一个表中只能有一个自增列。...每插入一行到表中,该列的值自动增加 ;⑦ 不像生成列,在插入新行时可以为自增列指定一个值 2.3.5、生成列 在 MySQL 中,生成列(GENERATED COLUMN)是一个特殊的列,它的值会根据列定义中的表达式自动计算得出...在 MySQL 中,主键需要遵循以下规则: 主键是定义在表上的。一个表不强制定义主键,但最多只能定义一个主键。 主键可以包含一个列或者多个列。 主键列的值必须是唯一的。...您可以在创建表的时候定义唯一键或者创建表后通过修改表增加一个唯一键。...这能增加应用的安全性。 MySQL 提供了 CHECK 约束来保证存储到表中的数据是符合你的要求的。不符合 CHECK 约束的数据会被拒绝。

    3.4K10

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

    开始不设置主键 表的设计如下: 如果id的位置有好几个0的话:设置主键并且自动排序时,0会从1开始递增; Insert 进去 id = 0的数据,数据会从实际的行数开始增加,和从0变化不一样;...如果使用主键自排约束以前表里有0,再设置完主键自排以后所有的0又不会根据行数,而是直接按照自上而下的顺序从1开始排。...哪怕没加主键自排以前只有一个0,加了主键自排以后还是会变成1。   开始有0,增加主键自排约束,0依次变为1,2,3,4.......   ...开始没0,增加主键自排约束,新添加的主键是0的行会根据行数自行变化,注意这里是新添加的行,使用的是insert。   开始没0,把某个主键的数修改成0,这个0会直接在排好序了再在表里显示出来。...说得简单一点就是,增加主键自排约束后:    主键的值:修改成的0,可以存在,就是排个序。         新添加的0,不允许存在,要根据行号改变。

    5.9K30
    领券