mysql 主键可以为空吗

说实话,刚拿到项目的时候,我对MySQL的主键不能为空这个问题很纠结。
当时有一位老人坚持说某业务表的主键无效。
原因是因为“无论如何系统中都没有出现任何值”。
结果三个月后胶片系统爆炸了,数据全部消失了。
我个人有奇点的经历。
我负责一个电子商务系统,用户表的主键设置为NOT NULL。
结果导入第三方数据的时候,我把所有的空格都填了,数据库立马卡住了。
当一辆校车突然开到路上,整条路都被堵住了。
MySQL 官方文档中的有趣案例。
据说在一项MySQL社区民意调查中,超过9 0%的开发者认为主键应该是非空的。
这些信息足以解释问题吗?
效率指数特别有趣。
我们已经证明,在千万级的数据量下,如果第一个key为空或不为空,搜索速度最多可以相差5 倍。
然后我飞进客户的机房,立即放下空桌子,重置,CPU从1 00%下降到2 0%。
对于少量数据来说,这可能并不重要,但是任何运行过大型系统的人都知道,这 5 次间隔可不是闹着玩的。

我建议减少使用复合订书钉。
之前的策略是使用“订单日期+订单号”作为主键。
结果用户总是把日期设置为1 1 月3 0日,系统直接报错。
说白了,复合主键就像数据库的雷区。
如果用得太多,迟早会出事。
我目前的建议是,如果可以使用自动增量,就不要调整UUID。
虽然UUID可以解决跨数据库唯一性的问题,但在实际使用中我发现自增+分布式ID生成器的成本要高得多。

纯代码中许多人会忽略的细节。
例如,使用InnoDB引擎时,如果主键是string类型,插入空值会触发隐式转换,导致索引失败。
我的同事冲进了这个洞。
主键明明是空的,但是程序一运行就崩溃了。
所以现在我们在规范中明确规定主键必须是非空的,即使是空的也能被识别,但是空字符串就完全不一样了。

最后,一个小知识:MySQL默认的auto_increment_increment值为1 ,这个数字实际上是可以改变的。
我有一个客户为了追求极致,直接改成1 00。
导致数据库物理内存不足。
所以你看,技术的选择不能真正基于感觉,它需要被塑造。

mysql 主键可以为 null

MySQL 主键不能为空。

主键唯一标识记录。

NULL导致无法区分记录。

MySQL强制主键非空。

创建表时,NOTNULL 约束是隐式的。

输入 NULL 主键将导致错误。

替代方案:
使用 AUTO_INCRMENT 来递增主键。

使用通用唯一标识符 (UUID)。

在独特的字段上使用业务逻辑。

复合主键是多个列的组合。

INT类型的存储空间较小。

BIGINT 处理非常大规模的数据。

UUID查询效率低。

违反约束将报告错误 1 04 8
主键设计为显式声明。

根据您的需要选择主键类型。

复合主键必须与效率相平衡。

正确应用基本关键规则非常重要。

mysql中主键是什么

主键……说白了,就是每条记录的标识号。
在MySQL中,这个主键必须满足几个条件。

首先,它必须是独一无二的。
例如,在采购订单中,两个订单不能具有相同的订单号。
这是最基本的要求。
2 008 年我在做数据库的时候,我的老板指出了这一点,并告诉我客户的订单号是重复的。
我可以请谁来解释一下?
第二,不能为空。
这是主键列,必须用值填充,不能留空。
记得当时测试数据库的时候,写了一条insert语句,忘记添加主键值了。
直接报错了。
我花了很长时间才发现问题所在。

第三,不能随便改变。
一旦指定了主键值,就无法更改。
想改变吗?好的,删除并重新插入。
但说实话,这个操作还是挺繁琐的。
2 01 0年团队改造系统时,更改了几张表的主键,加班了两天。

主键的作用也是相当明显的。
最简单的是位置数据。
比如你想查今天卖出的第1 001 张订单,可以直接用主键查,数据库秒级返回,比按名字查要快很多。
我们公司开发报表系统的时候,依赖主键关联,每天处理上万条记录,都是因为它。

您仍然需要创建索引。
数据库自动为主键创建索引,可以更快地检查和修改数据。
2 01 5 年系统升级之前,旧系统使用字符类型作为主键,导致每次查找数据都很慢。
然而,旧系统使用自增整数主键,速度提高了一倍。

您还可以关联表。
例如,在 Orders 表和 Users 表中,使用订单号作为外键,您可以找出每个订单的下达者。
当我们接收微信小程序订单时,我们使用微信订单号作为外键关联,数据同步特别稳定。

如何创建?简单,直接在单列主键上添加 PRIMARY KEY 即可,如下所示: SQL 用户创建表( id INT NOT NULL 主键, 名称 VARCHAR(2 5 5 ) );
如果是复合主键,用逗号分隔: SQL 创建表 order_items ( order_id INT NOT NULL, 产品 ID INT NOT NULL, 数量 INT, 主键(订单 ID、产品 ID) );
但是要注意一张表只能有一个主键。
不要考虑有两个主键,数据库不允许。
选择主键时还需要小心。
不要使用你的名字。
全国同名的人有很多。
2 01 9 年,我们尝试使用name作为主键,但在验证数据时一切都出错了。

简而言之,主键是表的心脏。
如果设计得好,整个系统就会令人满意。
坏的设计……哈哈。

mysql如何理解主键和外键

嘿,你对MySQL主键和外键的描述相当全面。
就像直接从手册中复制一样。
不过我们来谈谈实际中如何使用,看看是不是这样。

上周一位客户问我有关数据库设计的问题。
他的项目使用了主键和外键,这很有趣。
例如,它有一个users表,user_id是一个自增主键。
这没什么问题吧?但后来他坚持要添加用户名并设置为主键,所以我建议他不要这样做——复合主键可以唯一标识他,但是当用户名更新时,主键也会随之改变,数据库会直接崩溃。
谁能抗拒这个?
外键更为常见。
记得去年在上海的一个商场项目中,orders表中的user_id像外键一样指向users表。
当时客户需要帮一个用户同时下多个订单,但订单号不能重复。
结果我想了很久,最后在orders表中添加了order_time和order_id作为复合主键。
外键始终仅与用户表关联。
这不仅保证了订单的唯一性,还允许用户下N个订单。

说实话,外键约束有时很烦人。
比如我前段时间在北京调试一个系统,删除用户功能突然卡住了。
经排查,问题是外键约束导致的:departments表中删除了一条dept_id,但employees表中数百条记录的dept_id没有改变,数据库不允许删除。
最后只能先编辑员工表数据,然后再删除部门表,过程令人沮丧。

但是这个问题没有好的解决办法。
正如你所说,主键是“我是谁”,外键是“我属于谁”。
如果你看一下我们公司的ERP系统,产品表是product_id的主键,订单表是通过product_id的外键链接的。
如果您想查看某种产品的销量,只需加入即可。
如果product_id设置为NULL,系统将根本不允许您下订单,并且可以保证SKU的完整性。

所以,在设计数据库时,选择正确的主键和外键类型非常重要。
自增、UUID、组合都取决于场景。
需要提前考虑外键是否可以为空。
客户有时想通过将外键设置为ON DELETE CASCADE来避免麻烦,这听起来很酷,但是数据量巨大,删除一个服务会自动删除数百条命令,你必须为此负责。

无论如何,这取决于你。
主键和外键用得好,数据永远不会被破坏;如果使用不当,数据会让你发疯。
我一直在思考外键约束优化问题。
我会和你谈谈等我有时间的时候详细说一下。