sql?语句里?primary?key什么意思??怎么用?

说实话,主键在SQL中用得够多了,但每次给新人讲的时候,我都感觉得找一个具体的场景才能理解。
记得刚开始做数据库的时候,面对一堆表,只知道“主键是唯一标识符”是没有用的。
直到遇到一个实际案例我才明白。

以user表为例,比如某电商平台的users表。
一开始我以为只要给出一个ID并自动递增就可以了? 后来发现这个ID就是主键,决定了你可以通过一个用户ID直接找到所有对应的订单、收藏、评论。
例如,用户A的ID是1 008 6 ,查看订单时,可以直接使用WHERE user_id = 1 008 6 ,就会显示出来。
比用名字来查效率要高很多。
这就是所谓的唯一性。
每个1 008 6 只能对应一个用户。

有趣的是非空性。
这件事是非常难的。
您可以尝试插入一条没有ID的用户记录吗? 很多数据库会直接报错。
之前在测试环境中也犯过错误,以为NULL是通用值,结果却插入不了。
当我检查文档时,我发现主键是为“这条记录必须被唯一标记”而设计的。
没有空值的要求实在太苛刻了。

我们来谈谈自动增量。
这个东西很常用,但是我也遇到过坑。
例如,有一个旧系统。
orders表的主键是INT类型并且没有设置AUTO_INCRMENT。
结果,业务员手抖,在Excel中填写了重复的订单号,结果出现错误。
说实话,现在很多DBA默认把主键设置为BIGINT加AUTO_INCRMENT,就是为了省事,避免这种低级错误。
我帮助朋友解决过很多这样的问题,我总是向他们强调:“设计主键时,不要想着手动填写值。
如果可以,自动完成,这样你就不用担心了。

我也经历过联合主键概念的陷阱。
例如,有一个物流表,需要order_id和shipment_id来唯一标识一条物流记录。
当时我还不清楚,所以我认为最好设置一个自动递增的log_id。
不过后来我发现如果用两列来组合主键的话,数据库查询效率会高很多。
我有一个项目,使用order_id和shipper_id作为联合主键后,查询特定承运商的包裹统计信息直接快了5 0%,而且效果立竿见影。

最后一个外键关系是主键的隐藏值。
例如,user表中的主键user_id是order表中的外键user_id。
把这两者连接起来,当你查订单的时候,就可以直接看到是谁下的单,而不必再次关联用户表。
我曾经调整过一个复杂的报表系统,发现某个表的主键设计不当,导致了N级JOIN。
最终优化时,直接将中间表的代理键设置为主键。
结果,查询时间从几分钟缩短到几秒钟。
当时我对手里的DBA说:“看,这就是主键的另一种生命。

说白了,主键就是数据库中的“身份证”。
你称之为约束,但核心是保证每一条记录都能被唯一、准确、快速地找到。
不要低估这一串数字或字符。
很多时候,系统性能瓶颈和数据一致性风险都与主键设计是否正确有关。

数据库如何设置主键

说白了,在数据库中设置主键其实很简单,但复杂之处在于细节。
我们先来说说最重要的事情。
在SSMS中创建新表时需要设置主键。
比如我们去年跑的项目,数据量有3 000左右,每个表都严格按照这个步骤来设置主键。

还有一点,设置单列的主键非常简单。
只需选择需要设置为主键的列,右键单击,选择【设置主键】即可。
但有一个关键的细节,比如联合主键的设置。
您可能需要按住 Ctrl 键才能同时选择多列。
该操作在处理“学号+课程号”等组合主键时特别有用。

一开始以为主键是随便设置的,后来发现不对。
主键列必须满足非空约束,并且值必须唯一。
很多人没有注意到这一点,结果数据库经常抛出违反约束的错误,这是相当令人沮丧的。

等一下,还有一件事。
保存表结构时请注意,主键列的NOTNULL属性会被系统自动添加,但联合主键的各个组成列也必须允许非空值。
最后,不同数据库系统中设置主键的语法可能不同。
例如,在MySQL中,可以直接使用SQL语句来设置。
请特别注意这一点。

所以,我的建议是大家在设置主键,尤其是组合主键的时候一定要小心,以免日后带来不必要的麻烦。

mysql联合主键怎么设置

我必须告诉你这件事。
几年前,我在杭州做一个项目时遇到了这个问题。

当时,我们的系统需要记录用户的订单详细信息。
仅 order_id 是不够的。
还必须有一个product_id。
否则,如果我们按顺序购买了几件商品,我们如何才能区分它们呢?你应该是唯一和你在一起的人。
所以我使用联合主键来完成工作。

建表时直接写如下:
sql 创建表 order_details( order_id INT NOT NULL, 产品 ID INT NOT NULL, 数量 INT; 主键(订单 ID、产品 ID) );
我们没有将这两列设置为 NULL,因此它们必须有值。
我当时的同事忘记加NOT NULL,自己报错了。
他说,“主键不能有 NULL 值”,这让我笑了。

后来系统运行了一段时间。
数据太多,查询速度很慢。
我发现联合主键乱了。
我的联合主键是(order_id,product_id),但是order_id确实没有区别。
一个用户订购了很多商品,product_id 更加唯一。
您必须先输入product_id。

你需要改变它。
首先删除原来的主键.
sql 更改表 order_details 删除主键;
然后再添加。

sql ALTER TABLE order_details 添加主键(product_id, order_id);
这次查询速度快多了。
因此,公共主键的顺序非常重要,唯一值应该放在前面。
但不要添加太多热量。
有人告诉我不应超过 3 行。
列越多,查询速度就越慢。

还有另一个陷阱。
这意味着如果您想要更改主键值,例如将一个 order_id 更改为另一个,您将无法直接更新它。
必须先删除原来的主键,更新数据,然后重新添加主键。
当时我尝试自己更新,结果系统直接崩溃,报‘主键冲突’。
我吓坏了,赶紧备份了数据。

最烦人的是有时数据本身会变得混乱。
例如,存储重复的order_id和product_id组合。
如果此时添加主键,系统将崩溃并显示“数据重复”消息。
这时候首先需要清理数据,找到查找重复的SQL:
sql 选择订单 ID、产品 ID、COUNT() 已订购_详情 按订单 ID、产品 ID 分组 计数() > 1 ;
然后一一删除或合并。
我当时清理了好久,删除了十几条数据才清理完。

一般来说,联合主键非常好,可以保证数据的唯一性。
但是,使用它们时必须注意顺序。
不应该有太多的热量。
如果进行更改,必须先删除它们,然后再次添加。
如果您的数据重复,您需要先清理它。
虽然这看起来很简单,但实际使用中却存在很多陷阱。