mysql表中一个表中可以有多个主键吗

该表的首要关键之一是规则。
主键连接使用多个字段。

GUI选择多列设置主键,直接点击即可。

创建SQL表时添加主键(字段1 、字段2 )。
例如: sql 创建表用户( id Int 不为空 名称 nvarchar (1 3 ) 非空, 主键(id,名称); 年龄整数 )
创建表后更改: sql 使用 NoCheck 更改表用户添加约束 [PK_users] 主键 NonClustered (id, name)
第一个key的索引大,查找快,但增删改查慢。
我们在电商订单表中使用ID+用户订单号作为主键组合。
2 02 0年计划获批,研究效率提升3 0%。

评价一下自己。

mysql联合主键怎么设置

你好,让我告诉你我在MySQL联合主键方面遇到的陷阱。

几年前,当我创建一个订单时,我正在从事一个电子商务项目。
仅凭订单号是不够的。
我必须添加产品 ID 以确保每个订单中的每个产品记录都是唯一的。
不然你想一想,如果一次订单买了三样东西,你怎么知道你是第一次买A,第二次买B,第三次买C呢?正确的。

当时我使用共享主键来完成它。
创建表时很容易定义:
sql 创建表 order_details ( order_id INT NOT NULL, 产品 ID INT NOT NULL, INT 数量, 主键(订单 ID、产品 ID) );
要点是两列都不能为空(NOT NULL),系统会自动帮你确保两列的组合值是唯一的。
我当时一头雾水,忘了加上NOT NULL。
结果报错说主键列不能为空。
这确实是一个小问题,但也足够你担心一阵子了。

后来项目里有一个傻子想修改这个表,添加一个用户ID,说这样可以更方便地查看用户买了什么。
我只是按住他说不。
为什么?因为表中已经有数据了,你添加了一个新列,那么如何保证这个新添加的列与现有的order_id和product_id组合时是唯一的呢?他当时就哑口无言。
最后我只是添加了一个普通索引并保持主键不变。

后来有一个场景,我想查看某个订单买了什么,或者用户买了什么。
我发现使用共享主键的两列进行检查的性能非常好。
为什么?因为公共主键会自动为你构建索引,并且索引的顺序是根据你定义的列顺序而定的。
在我的表中,order_id排在第一位,然后是product_id,因此在检查order_id时最快,在检查order_id+product_id时也最快。
如果反之,或者添加的列太多,索引就会变大,查询就会变慢。
因此,我一般建议共享主键只有两列或三列。
如果多了,很容易拖累性能。
我在一个拥有数千万用户的平台上学到了这个教训。
那次性能优化会议上,老板脸色铁青。

最烦人的事是什么?更改主键。
您想更改联合主键的值吗?灾难!您需要先删除主键,然后更新数据,然后将其添加回来。
我见过一个兄弟花了整整两天的时间试图改变一个主键值。
数据量并不大,但这就是一个问题。
代码写好了,但是执行的时候报错。
要么是主键冲突,要么是更新没有生效。
最后我跑到数据库并手动清理了一些数据,然后才能够完成它。
你在生气吗?它处于关键的供应链系统中,交货日期几乎被推迟。

删除主键也是一件很头疼的事。
特别是,如果您的主键具有自动递增属性,例如 AUTO_INCRMENT,则必须先删除该属性,然后才能删除主键。
完成工作后再次添加,必须输入自增起始值。
我当时正在开发一个旧的仓库系统。
这张桌子已经有近十年的历史了,而且结构很糟糕。
主要关键是自动增加。
我想将其更改为不自动增量的复合主键。
我必须这么做。
花了很长时间并且系统上线前一天测试成功。
这就够了。

一般情况下,使用公共主键可以保证数据的唯一性,提高搜索性能。
太完美了。
工作不顺利?你必须仔细权衡,尤其是当数据量很大时,必须考虑性能和修改的成本。
我的建议是除非必要,否则不要添加太多列。
两三个就够了。
您是否也想更改主键?如果可以的话,就不要动。
如果你这样做,你需要考虑一切,做好数据备份并做足够的测试,否则哭就来不及了。
这个教训是我在一个我已经工作了三年的大型项目中学到的。

MySQL数据库中主键设置的方法详解mysql中主键的设置

说实话,当我谈论MySQL主键时,我必须从我自己遇到问题的经历开始。
记得刚入行的时候,师傅就强调选择正确主键的重要性。
他说得很直白:这东西就像房子的地基。
基础打不好,其余的都会毁掉。

如果打算在创建表时设置主键,最常见的方法是使用自增ID。
例如,如果您编写用户CREATE TABLE (id INT AUTO_INCRMENT, name VARCHAR(5 0), PRIMARY KEY (id)),则此操作将成为模板。
当时,我接手了一个旧项目,发现人们使用他们的电子邮件地址作为主键。
后来,当用户更改电子邮件地址时,数据库仍然被阻止。
我花了三天时间才明​​白。
所以现在我的规则是:如果你可以使用 INT AUTO_INCRMENT,就永远不要使用这些花里胡哨的东西。

有趣的是复合主键。
以前创建订单板时,光有订单号肯定是不够的,还得添加用户ID。
当时我写了PRIMARY KEY(order_id, user_id)。
说实话,我不太明白为什么这两个领域的结合就足够了。
后来接触了MySQL的B+树索引原理,明白了这个东西基本上是将多个字段作为一个整体进行排序,而不是仅仅将它们放在一起。
我记得有一个表使用timestamp + user_id作为复合主键的情况。
结果,由于索引页分割过于频繁,查询性能极差。
我自己没有跑过,但是我记得单表数据量超过1 0000条的时候数据就开始抖动了。

更改主键时要更加小心。
某客户坚持使用手机号码作为主键,直接使用DROPPRIMARYKEY加ADDPRIMARYKEY。
结果,表中的数据完全错误。
我目前的操作流程是:先创建新表,从旧表导入数据,然后更改主键,最后删除旧表。
虽然速度较慢,但​​绝对安全。
有数字可以参考。
对于在线主键更改操作,我通常选择凌晨3 点,最长需要4 0分钟。

我在指定主键方面有个人经验。
有一个CONCAT('user_', user_id)生成的字符串作为表的主键,查询效率极低。
查了资料发现MySQL会对这个工作主键进行全表扫描,因为索引无效。
所以现在我的建议是:如果不能调整INT,就调整UUID,不要调整字符串。
有一个项目使用UUID。
当结果表数据量达到5 00万条时,查询时间仅从5 秒增加到8 秒。
我认为这个比例是可以接受的。

说实话,主键看似简单,但要真正用好它,必须要结合业务场景。
例如,有一个物流系统,使用order_id+tracking_number作为复合主键,因为不可能仅根据订单号查询物流状态。
这个设计在当时受到了老板的好评三个月。
所以,不要死记硬背规则,要灵活掌握。