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

MySQL主键详解

主键(primary key) 一列 (或一组列),其能够唯一区分表中每个行。唯一标识表中每行这个列(或这组列)称为主键主键用来表示一个特定行。...表中任何列都可以作为主键,只要它满足以下主键值规则条件: 任两行不具相同主键值 每行都必须具有一个主键值(主键列不允许NULL) 这里规则是MySQL本身强制实施。...除MySQL强制实施规则外,还应该坚持最佳实践: 不更新主键列中 不重用主键 不在主键列中使用可能会更改 例如,如果使用一个名字作为主键以标识某个供应商,当该供应商合并和更改其 名字时...此时上述条件必须应用到构成主键所有列,所有列组合必须是唯一(多列中单个列可以不唯一)。...表主键含有一个以上字段组成,不使用无业务含义自增id作为主键 将多个字段设置为主键,形成复合主键,这多个字段联合标识唯一性,其中,某几个主键字段出现重复是没有问题,只要不是有多条记录所有主键值完全一样

4.9K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    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数据库中int类型最大_mysql自增主键最大

    大家好,又见面了,我是你们朋友全栈君。 1、mysql中int(11)中11代表显示宽度 整数列显示宽度,与mysql需要用多少个字符来显示该列数值,与该整数需要存储空间大小都没有关系。...a、int是整型,(11)是指显示字符宽度,最大为255。 b、int(11)是记录行数id,插入10条记录,那么它就显示00000000001 ~~~00000000010。...c、当字符位数超过11,它也只显示11位。 d、如果没有加未满11位就前面加0参数,就不会在前面加0。 e、如果没有给它指定显示宽度,MySQL会为它指定一个默认。...f、INT(3)会占用4个字节存储空间,并且允许最大也不会是999,而是INT整型所允许最大。...2、mysql有五种整型数据列类型,即TINYINT,SMALLINT,MEDIUMINT,INT和BIGINT。 a、区别是取值范围不同,存储空间不相同。

    6.1K20

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

    连续性 插入成功时,其数据 ID 和前一次插入成功时数据 ID 相邻。 自增主键单调性 为何会有单调性问题? 这主要跟自增主键最大获取方式,以及存放位置有关系。...如果最大是通过计算获取,并且在某些情况下需要重新获取时,会因为最新数据被删除而减小。 自增主键最大怎么取?存放到哪里?...MySQL 5.7 及之前版本,自增主键最大会在启动(重启)后从数据库中取出放到内存: SELECT MAX(ai_col) FROM table_name FOR UPDATE; 这样获取是通过计算...从 MySQL 8.0 开始,自增主键最大会在每次修改后写入到 redo log,并且在每个检查点写入引擎私有的系统表。 如果是正常重启,则读取系统表里。...参考文档 为什么 MySQL 自增主键不单调也不连续 https://database.51cto.com/art/202004/614923.htm 《MySQL技术内幕——InnoDB存储引擎》

    10.8K10

    Mysql资料 主键

    主键(primary key) 一列(或一组列),其能够唯一区分表中每个行。 唯一标识表中每行这个列(或这组列)称为主键。...表中任何列都可以作为主键,只要它满足以下条件: 1、任何两行都不具有相同主键值 2、每个行都必须具有一个主键值(主键列不允许NULL) 除MySQL强制实施规则外,应该坚持几个普遍认为最好习惯为...: 1、不更新主键 2、不重用主键 3、不在主键列中使用可能会更改(例如,如果使用一个名字作为主键以标识某个供应商,应该供应商合并和更改其名字时,必须更改这个主键) 总之:不应该使用一个具有意义...2、.如果使用非自增主键(如果身份证号或学号等),由于每次插入主键近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置: 此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉...如果没有显式地在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节ROWID,并一次作为主键mysql 在频繁更新、删除操作,会产生碎片。而含碎片比较大表,查询效率会降低。

    3.8K20

    mysql修改自增起始

    A: select max(id) from A; auto_increment id=58000; B: 只有主键没有自增键 select id from B by id desc limit...A自增列起始,通过如下命令 alter table A auto_increment=2000000; 修改后起始从200w开始。...接下来继续测试,DELETE,TRUNCATE 触发AUTO_INCREMENT变化 **结论** : delete 操作不会变更 AUTO\_INCREMENT当前顺序 truncate...操作会导致AUTO\_INCREMENT 从1开始, **主因**: 后来发现主要原因是所在实例重启造成,auto_increment自增值在mysql8.0之前一直是记录内存中, 当实例重启时候该会丢失...,那么mysql会取select max(id) + 1 作为新插入数据自增ID, 这样启动后就A表从58000开始而不是1873741开始,这样造成插入B表会重复

    3.5K30

    mysql联合主键

    1、hibernate配置联合主键 1.1 联合主键好处: 联合主键好处是不需要因为需要主键而增加一个无用主键列 1.2 联合主键建表语句 CREATE TABLE `HTTP_TERMINAL_DETAIL_STATISTICS...即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型 “version” 字段来实现。当读取数据时,将version字段一同读出,数据每更新一次,对此version加一。...当我们提交更新时候,判断数据库表对应记录的当前版本信息与第一次取出来version进行比对,如果数据库表当前版本号与第一次取出来version相等,则予以更新,否则认为是过期数据 2.2 乐观锁配置方式...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 = ‘库名’; 发布者:

    4K20

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

    大家好,又见面了,我是你们朋友全栈君。 自增主键:特指在自增列上定义主键。 自增主键优点是让主键索引保持递增顺序插入,避免页分裂,索引更加紧凑。 1. 自增值保存在哪?...每次重启后第一次打开表,都会去查找自增值最大max(id), 并设置表当前自增值为max(id) + 1; mysql8.0, 自增值变更记录在了redo log中,重启时依靠redo log恢复重启之前...指定了具体,若指定小于当前自增值,则自增值不发生改变;若大于当前自增值,则自增值为指定+auto_increment_increment; 3. 自增值修改时机? a....自增值修改发生在插入数据操作之前,如果插入失败,自增值不会再修改回去; b. 事务回滚也不会将自增值修改回去; c. 为了减少自增id锁带来性能影响,mysql不会修改回去之前自增值; 4....自增值到达上限 自增值不再变化,再次申请时,得到保持不变。

    9.4K50

    故障分析 | MySQL 无法修改主键?原来是因为这个参数

    1问题背景 同事咨询了一个问题,TDSQL(for MySQL)中某张表主键需要改为联合主键,是否必须先删除现有的主键?因为删除主键时,提示这个错误。...解决方案是增加主键或者删除此参数避免错误,同时提醒了,如果表无主键,可能会导致基于行复制产生性能问题。 sql_require_primary_key 参数控制是强制检查主键,可以动态修改。...参数名称:sql_require_primary_key 作用范围:Global & Session 动态修改:Yes 默认:OFF 该参数设置为 ON 时,SQL 语句 create table 创建新表或者...alter 语句时,对已存在表进行修改,将会强制检查表中是否包含主键,如果没有主键,则会报错。...另外,鉴于该参数设置成为非默认,创建完主键,需要记得改过来。 方案二 如果 sql_require_primary_key 设置为 ON,意思就是表任何时刻都需要有主键,不能出现真空。

    56910

    MySQL主键设计盘点

    主键设计和应用原则 除了满足MySQL强制实施规则(主键不可重复;一行中主键不可为空)之外,主键设计和应用应当还遵守以下公认原则: 不更新主键列中; 不重用主键; 不在主键列中使用可能会更改...2、对数据库有依赖,每种数据库可能实现不一样,数据库切换时候,涉及到代码修改,不利于扩展 结论: 自增id做主键适用于非分布式架构。...关于MySQL 使用自增ID主键和UUID 作为主键性能比较可以查看参考【8】。 结论: 1、uuid做主键适用于小规模分布式架构用。...2、在使用uuid作为主键时候,最好设计createtime(创建时间)列和modifytime(修改时间)列以应付可能排序等场景。...结论: 用自建id生成器做主键适用于大规模分布式架构 参考: 【1】:红心李 :MySQL主键设计 【2】:Uncle Nucky :MySQL数据库主键设计原则 【3】:ellis:设计套路:Mysql

    4.2K30

    Mysql与Oracle中修改默认

    于是想到通过default来修改默认: alter table A modify column biz default 'old' comment '业务标识 old-老业务, new-新业务'...找后台运维查生产数据库,发现历史数据biz字段还是null 原因: 自己在本地mysql数据库试了下,好像的确是default没法修改历史数据为null 。这就尴尬了。...看起来mysql和oracle在default语义上处理不一样,对于oracle,会将历史为null刷成default指定。...总结 1. mysql和oracle在default语义上存在区别,如果想修改历史数据,建议给一个新update语句(不管是oracle还是mysql,减少ddl执行时间) 2....即使指定了default,如果insert时候强制指定字段为null,入库还是会为null

    13.1K30

    MySQL主键约束使用

    MySQL主键约束是一种用于确保表中每行数据唯一性限制。每个表只能有一个主键,它可以是一个或多个列。创建表时添加主键约束在创建表时添加主键约束,需要在列名后面添加关键字"PRIMARY KEY"。...这意味着在插入数据时,必须确保"id"列唯一,否则将会出现错误。在已经存在表中添加主键约束如果已经存在一个表,但需要将某些列或字段添加主键约束,可以使用ALTER TABLE语句来修改表结构。...需要注意是,在修改表结构时,必须将该列中已经存在都设置为唯一,否则会出现错误。主键约束和自增列通常情况下,主键约束通常与自增列一起使用。自增列是指在插入新行时,自动为该行分配一个唯一。...这意味着在插入数据时,无需提供"id"列MySQL会自动为其分配一个唯一。示例假设有一个用户表,其中包含以下列:id、name和email。...,MySQL会自动为其分配一个唯一

    2.6K20

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

    开始不设置主键设计如下: 如果id位置有好几个0的话:设置主键并且自动排序时,0会从1开始递增; Insert 进去 id = 0数据,数据会从实际行数开始增加,和从0变化不一样;...再重置一下自动排序,看看这个0会不会有变化, 先取消自排; 再加上自排,果然跟想一样,0要变成1了,错误提示说主键有重复1所以不让自排, 修改之后,果真可以了,0变成1了,        ...如果把表中某个主键数改成0,那直接就会进行排序放到正数前面,也就是说主键自排是允许有0存在,那为什么本身存在0要去修改成从1开始递增序列呢?...开始没0,增加主键自排约束,新添加主键是0行会根据行数自行变化,注意这里是新添加行,使用是insert。   开始没0,把某个主键修改成0,这个0会直接在排好序了再在表里显示出来。...说得简单一点就是,增加主键自排约束后:    主键修改0,可以存在,就是排个序。         新添加0,不允许存在,要根据行号改变。

    4.3K30

    Mysql:小主键,大问题

    本篇讲解 Mysql 主键」问题,从「为什么」角度来了解 Mysql 主键相关知识,并拓展到主键生成方案问题。再也不怕被问到 Mysql 时只知道 CRUD 了。...否则由于每次插入主键近似于随机,因此每次新记录都要被插到现有索引页中间某个位置,MySQL 不得不为了将新记录插到合适位置而「移动数据」,如下图右侧所示,这样就造成了一定开销。...Key 时,就想先添加一条记录,之后再更新业务 Key 设计一个兼具易用和性能 Key 生成方案比较难 逻辑 Key 优点 不会因为业务变动而需要修改 Key 逻辑 操作简单,且易于管理 逻辑...,容易出现重复 Key 测试环境和正式环境 Key 不一致,不利于排查问题 Key 没有和数据关联,不符合三范式 不能用于搜索关键字 依赖不同数据库系统具体实现,不利于底层数据库替换 五、主键生成...一般是机器主机名散列,这样就确保了不同主机生成不同机器 hash ,确保在分布式中不造成冲突,同一台机器相同。 PID:进程 ID。2 字节。

    3.8K10

    大战MySQL主键及其操作

    简忆上次所学知识:MySQL记录长度为65535个字节,而varchar是达不到它理论长度,NULL占用一个字节,text文本不占用记录长度,因为它本身就占据十个字节。...这里继续学习与MySQL列属性相关知识:关于主键增,改,删。...主键 主键:primary key (一张表中最多只能有一个主键主键,简而言之为主要键,一张表中只能有一个字段可以使用对应键,用来约束该字段里面的数据,不能重复,被称之为主键 。...三.当表已经创建好之后,额外追加主键:可以通过修改字段属性,也可以直接追加Alter table 表名 add primary key(字段列表); 前提:表中字段对应数据本身是独立(即不重复)...主键约束(修改数据) 主键对应字段中数据不允许重复:一旦重复,数据操作就会失败(增和改) 相关语句: -- 向表中插入数据 insert into my_pril values ('小明','itcast0001

    4.4K20
    领券