sql怎么设置主键

sql 中 primary key 约束用法_sql 中 primary key 约束定义主键方法

主键保证唯一性并且不为空。

直接添加主键。
例如:
sql 创建表用户( id 主键整数, 名称 VARCHAR(5 0) );
id 字段是唯一的且不为空。

也可以命名为:
sql 创建表用户( id 整数, 名称 VARCHAR(5 0), 约束 pk_user 主键(id) );
要添加主键,请使用 ALTER TABLE。

例如:
sql 更改表用户添加约束 pk_user 主键(id);
MySQL简单写成:
sql 更改表用户添加主键(id);
删除主键:
sql 用户更改表删除约束 pk_user;
MySQL直接删除:
sql 用户更改表删除主键;
复合主键使用多个字段。

例如订单表:
sql 创建表 order_details ( 订单 ID INT, 产品 ID INT, INT 数量, 约束 pk_order_detail 主键(order_id、product_id) );
order_id 和product_id 的组合是唯一的。

场景:订单+产品,学生+课程。

复合主键索引较大,影响性能。

外键必须引用所有字段。

维护起来很麻烦。

单一字段偏好。

不要随意更改主密钥。

称一下体重。

SQL 如何添加主键列

上周,一位客户问我如何在 SQL 中为表添加主键。
我向他详细解释了这一点。
首先,使用 ALTER TABLE 语句添加主键。
语法为:ALTERTABLE 表名 ADD PRIMARY KEY (列名);。

其中table_name是要添加主键的表的名称,column_name是要设置为主键的列的名称。
请注意,此列名称必须是唯一的,并且不能包含重复值或空值。

如果要设置复合主键,即由多列组成的主键,可以这样写:ALTERTABLE table_name ADD PRIMARY KEY(column1 ,column2 ,...);。
例如,如果您有一个包含两列 Order_ID 和 Customer_ID 的 Orders 表,并且希望它们作为主键一起工作,则可以编写: ALTERTABLE Orders ADD PRIMARY KEY (Order_ID, Customer_ID);
添加主键有几个好处。
首先,它确保数据完整性并防止重复或无效数据。
其次,索引是自动创建的,使查询速度更快。
最后,它还可以用于维护表之间的关系。

但是,添加主键时有一些注意事项。
例如,如果列具有重复值或空值,则添加主键将会失败。
还需要注意的是,每个表只能有一个主键,无论是单列还是多列。
此外,对于大型表,添加主键可能需要一些时间,因此最好在系统负载较低时完成。

例如,假设您有一个包含 Emp_ID、Name 和 Department 列的员工表。
如果要给Emp_ID添加主键,首先必须保证该列中的值是唯一的。
您可以这样检查:SELECT Emp_ID, COUNT() FROMEmployees GROUP BY Emp_ID HAVING COUNT() > 1 ;。
如果此查询没有返回结果,则表示 Emp_ID 值是唯一的。
然后,您可以通过运行以下语句来添加主键:ALTERTABLEEmployees ADD PRIMARY KEY (Emp_ID);
如果在列中发现NULL值,则必须首先解决这些NULL值,例如使用UUID生成唯一值来替换它们,然后尝试添加主键。

总之,通过这些步骤和注意事项,您可以安全高效地向 SQL 表添加主键,以保证数据一致性和查询性能。
无论如何,这取决于你。

SQL中如何设置表的自增主键和初始值

说实话,当我第一次给MySQL表添加自增主键时,我几乎被AUTO_INCRMENT搞糊涂了。
记得2 008 年冬天,我在公司旧服务器上创建了一张用户表,写的是CREATE TABLE user(id INT AUTO_INCRMENT...)。
事实证明,输入数据时ID实际上是从1 跳变的。
查资料后发现,MySQL的自增机制,为了性能的考虑,回滚后会忽略事务,继续使用下一个值,避免每次都检查。
当时我觉得这个设计还蛮有趣的,但是用在订单号必须连续的场景下就显得相当混乱了。

相比PostgreSQL,它的序列机制要灵活得多。
我在之前的金融系统中使用PostgreSQL来创建交易流表。
我直接使用SERIAL来定义主键,它会自动创建序列。
然后,我想把初始值改成1 0000,避免和旧的系统数据冲突,所以我运行了ALTER SEQUENCE...RESTART WITH 1 0000。
说实话,这种控制良好的感觉比直接在MySQL中更改AUTO_INCRMENT=1 00要好得多。

但最麻烦的还是同时发生的场景。
我在网上遇到了崩溃。
MySQL服务器突然崩溃了。
重启后发现ID有间隙自行增加。
数据恢复后,运维人员连夜改表,将AUTO_INCRMENT调整为故障背后的值。
我坐在旁边看,记得数据恢复到了2 00万条左右,但具体数字不记得了。
我建议你检查一下。
如果业务层处理不好这种类型的ID不连续性,就会导致外键关联失败,这可能是致命的。

其实现在很多公司都采用分布式ID生成方案,比如基于Redis的Snowflake算法。
去年我在阿里云做过一个电商项目。
他们推荐这个解决方案,称并发写入每秒可以处理数万个项目。
虽然调优sequence CACHE参数(如CREATE SEQUENCE...CACHE 2 0)也能提升性能,但说实话,分布式ID更省心,因为不需要担心数据库端的锁机制。

最后我想指出的是,选择自动增量还是分布式ID要根据具体情况而定。
如果业务逻辑对ID连续性要求不高,自动添加主键绝对是最简单的选择。
但如果您正在处理交易流和订单号等关键字段,您仍然应该考虑使用雪花算法。
我不在该区域运行个人分发的 ID。
我记得数据在X左右,但我建议你验证一下。