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

mysql设置主键列会有什么限制

在MySQL中设置主键列时,会有一些限制和注意事项:

基础概念

主键(Primary Key)是数据库表中用于唯一标识每一条记录的列。它具有以下特性:

  • 唯一性:主键列中的每个值必须是唯一的,不允许有重复的值。
  • 非空性:主键列中的每个值不能为空(NULL)。
  • 单一性:一个表只能有一个主键,但可以由多个列组成复合主键。

相关限制

  1. 唯一性约束:主键列中的每个值必须是唯一的。如果尝试插入重复的值,数据库会抛出错误。
  2. 非空约束:主键列中的每个值不能为空。如果尝试插入NULL值,数据库会抛出错误。
  3. 数据类型:主键列通常使用数值类型(如INT、BIGINT)或字符串类型(如VARCHAR),因为这些类型更容易保证唯一性。
  4. 索引:主键列会自动创建一个唯一索引,这有助于提高查询效率。
  5. 外键约束:主键列常用于定义外键关系,因此需要确保主键列的值在相关表中是存在的。

应用场景

  • 唯一标识记录:主键用于唯一标识表中的每一条记录,便于快速查找和更新数据。
  • 表间关系:主键常用于定义表与表之间的关系,如外键约束。

示例代码

以下是一个创建表的示例,其中包含一个主键列:

代码语言:txt
复制
CREATE TABLE users (
    user_id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE
);

在这个示例中,user_id列被设置为主键,具有唯一性和非空性约束。

参考链接

常见问题及解决方法

  1. 主键冲突
    • 问题:尝试插入重复的主键值。
    • 原因:违反了主键的唯一性约束。
    • 解决方法:确保插入的值在主键列中是唯一的,或者修改数据以避免冲突。
  • 主键为空
    • 问题:尝试插入NULL值到主键列。
    • 原因:违反了主键的非空性约束。
    • 解决方法:确保插入的值不为空,或者在插入前进行检查和处理。
  • 主键选择不当
    • 问题:选择了不适合的数据类型作为主键,导致性能问题。
    • 原因:数据类型不适合保证唯一性或查询效率低下。
    • 解决方法:选择合适的数据类型,如INT、BIGINT或UUID,以确保唯一性和查询效率。

通过以上解释和示例,希望你能更好地理解MySQL设置主键列的限制和应用场景。如果有更多具体问题,欢迎继续提问。

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

相关·内容

MySQL 表中非主键溢出情况监控

之前踩到过MySQL主键溢出的情况,通过prometheus监控起来了,具体见这篇MySQL主键溢出复盘 这次遇到的坑,更加的隐蔽。 是一个log表里面的一个int signed类型的写满了。...')')  from information_schema.COLUMNS where TABLE_SCHEMA NOT IN ('information_schema','sys','test','mysql.../bin/bash # 监测int类型的当可用空间少500w的时候,提醒做DDL操作  # 设置 session级别的 max_execution_time为2秒,防止没有索引的大的拖慢数据库,但是这样可能漏判部分列... -pv # step1 检测 for host in {'192.168.1.100','192.168.1.110','192.168.1.120','192.168.1.130'}; do mysql...wait echo "说明: |  当前列允许的最大值  |  巡检用的SQL     " >> $(date +%F)/$host.log while read line; do    ret=$(mysql

2K10
  • mysql 设置主键命令_MySQL常用命令

    1、修改MySQL密码 方法一: use mysql; update user set password=PASSWORD(“123456”) where user=‘root’; flush privileges...那么password字段要改成authentication_string 创建数据库用户: 单纯的创建:create user ‘name’@‘host’ identified by ‘密码’ 创建时设置用户权限...10,不允许该字段为空 删除:drop table 表名称 drop table test 4、表中插入数据 insert into test(id) values(1002); #此处注意如果字段值设置为...set id=’1005′ where id=1002; 6、表中字段的删除和增加 增加:alter table test add name char(12) after id; #alter 表示在什么字段之后...删除:alter table test drop name; 7、表名称修改 rename table test to nameinfo; 8、表中主键创建 方式一: 创建表时创建主键:create

    3.8K20

    mysql多字段主键_sql改变数据类型

    MySQL数据类型 (1)数值类型 1、整数型 2、浮点型 3、定点型 (2)日期时间类型 (3)字符串类型 MySQL字段属性 1、空\不为空值:NULL、NOT NULL 2、主键:primary...存储文字,当字符大于255时,一般使用text; mediuntext L+3 中等长度文本数据 longtext L+4 极大文本数据 不要轻易的使用最大限度来存储字符串,因为涉及记录长度问题 : MySQL...空\不为空值:NULL、NOT NULL 字段的数据默认情况下是允许为空的,比如说一条人的信息记录中可以没有邮箱(或许有些人考虑用“空字符串”来代表),我们允许可以不填入数据的字段可以设置为null;但比如说某些必填数据...,我们不想填入的时候留空,可以设置这个字段为not null 主键:primary key 主键用于唯一标识每一条记录(每个人都有自己唯一的身份证) 每一张表只能有一个主键。...因为唯一标识,所以主键字段的数据不能为空,并且主键字段的数据值不能重复 主键也是一种索引,可以提高查找速率。

    2.5K20

    MySQL什么要给表加上主键

    这就是为什么一个表只能有一个主键,一个表只能有一个「聚集索引」,因为主键的作用就是把「表」的数据格式转换成「索引(平衡树)」的格式放置。   ...  这样展现出来的图形如下:   实际上,我们还有更狠的操作,直接关闭坐标轴:   plt.axis("off"www.jintianxuesha.com)   结果如下:   范围设置...  我们还可以对坐标轴的范围进行设置,如下:   import matplotlib.pyplot as plt   plt.rcParams['font.sans-serif'www.lecaixuanzc.cn...,下面就是一个主键和三个常规索引的结构 4.通过主键去查,叶子节点就是数据行 5.通过其他索引字段去查,那么叶子节点是主键ID,然后再去根据主键查,聚集索引(主键)是通往真实数据所在的唯一路径 7...不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql

    2.5K20

    什么MySQL主键查询这么快

    数据页的结构很显然,数据页也会有自己的格式表示,像行格式一样,我先列出两个我们用到的字段,其他的用到再说吧。...如果你足够叛逆,你可能会想,你不设置主键的话是不是MySQL就崩了啊?...下面我们补充一下行格式图片再次强调我画的字段的顺序并非在存储设备中实际存储的顺序只有在InnoDB实在无法确定主键的情况下(创建时不指定主键,同时没有Unique键),才会添加DB_ROW_ID3.2...番外:为什么推荐使用自增ID作为主键,而不推荐使用UUID?...但是对于我们这篇文章的主题——MySQL主键查询为什么这么快,只能算是回答了一半,毕竟在数据页中进行搜索的前提是你得先找到数据页啊。这就是每次面试必问的MySQL索引的知识了,下一篇文章再介绍吧。

    4.1K92

    MySQL自增主键什么不连续

    自增主键可以让主键索引尽量的保持递增顺序插入,避免页分裂,索引更加紧凑。 自增主键保存在何处?...不同的引擎对于自增值的保存策略不同: MyISAM引擎的自增值保存在数据文件中 InnoDB引擎的自增值保存在内存里,但是在MySQL8.0以后,该自增值才可以被持久化:MySQL5.7以前,自增值没有持久化每次重启后第一次打开表的时候...事务回滚为什么自增值不能回退 两个并行的事务在申请自增值的时候,为了避免两个事务申请到相同的自增id,需要加锁按照顺序申请,如果自增值可以回退需要做一些特殊处理: 每次申请id之前,判断表里此id是否存在...参数innodb_autoinc_lock_mode的不同会影响锁的释放时机: 该参数如果为0,语句执行结束后释放锁 设置为1:普通insert语句,自增锁在申请后马上释放;insert...select...值设置为1,对于insert...select这种无法提前知道申请多少个id,那就在需要的时候申请1个,如果有10w行数据那就需要申请10万次,对于批量插入数据的语句,MySQL有一个批量申请自增id的策略

    8.4K20

    mysql什么建议使用自增主键

    但是如果你要弄明白什么是页分裂,或者什么情况下会页分裂,这个时候你就需要对 mysql 的底层数据结构要有一定的理解了。...我这里也稍微解释一下页分裂,mysql (注意本文讲的 mysql 默认为InnoDB 引擎)底层数据结构是 B+ 树,所谓的索引其实就是一颗 B+ 树,一个表有多少个索引就会有多少颗 B+ 树,mysql...如果主键为自增 id 的话,mysql 在写满一个数据页的时候,直接申请另一个新数据页接着写就可以了。...如果主键是非自增 id,为了确保索引有序,mysql 就需要将每次插入的数据都放到合适的位置上。...其实对主键 id 还有一个小小的要求,在满足业务需求的情况下,尽量使用占空间更小的主键 id,因为普通索引的叶子节点上保存的是主键 id 的值,如果主键 id 占空间较大的话,那将会成倍增加 mysql

    5K31

    MySQL主键自增值为什么有“空洞”?

    最终发现了MySQL主键自增值“空洞”了 1.场景准备 测试场景为MySQL 8.0: 主键重复场景 唯一键重复场景 1、建表,包含主键及唯一约束 CREATE TABLE t1( id int(...# 测试主键重复 mysql> insert ignore into t1 values (1,'aaa', 111); Query OK, 0 rows affected, 1 warning (0.00...# 测试主键重复 mysql> replace into t1 values (1,'aaa', 111); Query OK, 2 rows affected (0.00 sec) mysql> select...可是理解了这个并不能马上理解现在的这个问题,我们知道当数据进行数据插入的时候,如果插入的数据中自增列不指定其值的时候,该就会以当前自增值作为其值,如果指定其值就会插入指定的值,当然也有满足唯一的原则,...技术分享 | 微服务架构的数据库为什么喜欢分库分表?

    2.2K20

    设置MySQL储存文件大小的限制

    在servlet上传图片到MySQL数据库过程中,MySQL存储文件大小是有限制的,比如数据库只能存储1M文件的大小,上传的文件就不能超过这个限制,如果超过限制就会报以下的错误信息: 故障现象:数据存储文件的时候报...以上的问题就是上传文件的大小已经超过数据库限制的大小,导致数据库存储不了文件,所以这个时候我们需要重新设置数据库存储文件的大小: 从报错看是 mysql的 max_allowed_packet参数值设置太少了...,用show VARIABLES like ‘%max_allowed_packet%’;查看,显示的是1M(1024x1024),这当然就有问题了,超过1M就存不了 MySQL根据配置文件会限制server...有时候大的插入和更新会被max_allowed_packet 参数限制掉,导致失败,要重新设置参数可以在MySQL命令行中运行: set global max_allowed_packet = 2x1024x1024x10...然后关闭掉这此MySQL Server链接,再重新连接。

    3.7K70

    不做微信认证,小程序会有什么限制?| 小程序问答 #28

    主体类型不同的小程序,有什么不同? 1. 微信支付 个人主体和组织主体小程序之间的能力差异,最大的应该就是微信支付了。 只有通过了微信认证的小程序,才有权使用微信支付接口。...也就是说,主体为个人的小程序,是无法为小程序设置门店的;这样的小程序也不会出现在「发现」-「小程序」中「附近的小程序」的列表里。 除此之外,主体不同的小程序之间,就没有其他的差别了。...认证与否,有什么区别? 如果不进行微信认证,小程序是不能享受微信认证的「特权」的,即无法使用微信支付接口、指定的开发者上限为 10 人。...但是,即使未通过微信认证,主体为企业的小程序也可以为小程序设置线下门店。 当用户接近你所设定的门店位置后,他们可以在「附近的小程序」列表中,找到你的小程序。...「小程序问答」提问指南 关于小程序,你还有什么想问的? 只要是有关小程序的所有问题,都可以关注「知晓程序」公众号,在微信后台直接向我们提问。

    8.5K10

    你的MySQL什么会有幻读问题?

    主键id,索引c。 下面的语句怎么加锁,何时释放? ? 该语句会命中d=5一行,对应主键id=5。 因此在select 语句执行完后,id=5一行会加写锁。...再往session B和session C里面分别加一条SQL语句,你再看看会出现什么现象。 假设只在id=5这行加行锁 - 语义被破坏 ?...所以,你如果把隔离级别设置为读提交,就没间隙锁。 但同时,要解决可能出现的数据和日志不一致问题,要把binlog格式设为row。这也是很多公司使用的配置。...如果大家都用读提交,可是逻辑备份时,mysqldump为什么要把备份线程设置成可重复读? 然后,在备份期间,备份线程用的是可重复读,而业务线程用的是读提交。...同时存在两种事务隔离级别,会不会有问题? 进一步地,这两个不同的隔离级别现象有什么不一样的,关于我们的业务,“用读提交就够了”这个结论是怎么得到的?

    37710

    Mysql 5.7 的‘虚拟’是做什么

    Mysql 5.7 中推出了一个非常实用的功能 虚拟 Generated (Virtual) Columns 对于它的用途,我们通过一个场景来说明 假设有一个表,其中包含一个 date 类型的 `...虚拟 Generated Columns 就是用来解决这个问题的,可以增加一个可被索引的,但实际上并不存在于数据表中 对于上面的例子,可以对 SimpleDate 创建一个虚拟,然后对虚拟创建索引...PRIMARY KEY (`id`), KEY `SimpleDate_dayofweek` (`SimpleDate_dayofweek`), ) ENGINE=InnoDB 这样就建好了虚拟,...查询语句可以正常使用索引 通过虚拟的方式,即满足了查询性能,也不会有之前那个解决方案的潜在麻烦 虚拟不存储在数据行中,但虚拟的元数据信息会存在于相关系统表中,对虚拟的添加或者删除只会涉及这些系统表...,不会导致数据表的重建,所以效率很高 需要注意,不能建立虚拟和真实的联合索引

    1.9K60

    什么MySQL不推荐使用uuid作为主键

    前言 在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一,单机递增),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用...uuid,使用uuid究竟有什么坏处?...user_random_key写入结果: [1240] user_uuid表写入结果: [1240] 1.4.效率测试结果 [1240] 在已有数据量为130W的时候:我们再来测试一下插入10w数据,看看会有什么结果...那么为什么会出现这样的现象呢?...,提升了页面的最大填充率,不会有页的浪费 ②新插入的行一定会在原有的最大数据行下一行,mysql定位和寻址很快,不会为计算新行的位置而做出额外的消耗 ③减少了页分裂和碎片的产生 2.2.使用uuid的索引内部结构

    4.9K30
    领券