如何为SQL表每行分配ID整数值并设置主键
解决方案
方法一:为已存在的ID列填充递增值并设为主键
针对你已经添加了空ID列的情况,可按不同数据库类型执行以下操作:
MySQL/MariaDB
- 为ID列填充递增数值:
SET @row_number = 0; UPDATE 你的表名 SET ID = (@row_number := @row_number + 1);
- 修改ID列属性,设为主键并开启自增(方便后续插入数据):
ALTER TABLE 你的表名 MODIFY COLUMN ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY;
SQL Server
- 用窗口函数更新ID值:
WITH CTE AS ( SELECT ID, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rn FROM 你的表名 ) UPDATE CTE SET ID = rn;
- 设置ID列为主键:
ALTER TABLE 你的表名 ALTER COLUMN ID INT NOT NULL; ALTER TABLE 你的表名 ADD CONSTRAINT PK_你的表名_ID PRIMARY KEY (ID);
若需要后续插入自动递增,可修改列属性:
ALTER TABLE 你的表名 ALTER COLUMN ID INT IDENTITY(1,1);
PostgreSQL
- 填充ID递增值:
UPDATE 你的表名 SET ID = row_number() OVER (ORDER BY (SELECT NULL)) WHERE ID IS NULL;
- 设置为主键并配置自增序列(可选):
ALTER TABLE 你的表名 ALTER COLUMN ID SET NOT NULL; ALTER TABLE 你的表名 ADD PRIMARY KEY (ID); -- 关联自增序列,支持后续插入自动赋值 CREATE SEQUENCE 你的表名_id_seq OWNED BY 你的表名.ID; SELECT setval('你的表名_id_seq', (SELECT MAX(ID) FROM 你的表名)); ALTER TABLE 你的表名 ALTER COLUMN ID SET DEFAULT nextval('你的表名_id_seq');
方法二:更简便的一步式操作(未创建ID列时适用)
如果还没添加ID列,可直接新增带自增属性的主键列,数据库会自动为现有行分配1、2、3...的递增值:
MySQL/MariaDB
ALTER TABLE 你的表名 ADD COLUMN ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
SQL Server
ALTER TABLE 你的表名 ADD ID INT IDENTITY(1,1) PRIMARY KEY;
PostgreSQL
ALTER TABLE 你的表名 ADD COLUMN ID SERIAL PRIMARY KEY;
内容的提问来源于stack exchange,提问作者Declan Davies
相关产品推荐
相关产品推荐

