SQL新手求助:基于重复id列与brand列创建idx列作为主键
问题描述
我是SQL新手,现有一张包含id、brand列的表,其中id列存在重复数据,原表数据如下:
| id | brand |
|---|---|
| 1 | 100 |
| 1 | 200 |
| 2 | 100 |
| 2 | 200 |
| 3 | 100 |
| 4 | 100 |
希望基于id和brand列创建新的idx列,生成结果如下:
| id | brand | idx |
|---|---|---|
| 1 | 100 | 101 |
| 1 | 200 | 201 |
| 2 | 100 | 102 |
| 2 | 200 | 202 |
| 3 | 100 | 103 |
| 4 | 100 | 104 |
需要将idx作为其他场景的主键,求解决方案。
核心逻辑分析
idx的生成规则:截取brand的前两位数字,与id拼接成新整数。比如brand=100取前两位10,加上id=1得到101;brand=200取前两位20,加上id=1得到201。
各数据库实现方案
MySQL/MariaDB
用LEFT()截取前两位,CONCAT()拼接后转无符号整数:
SELECT id, brand, CAST(CONCAT(LEFT(brand, 2), id) AS UNSIGNED) AS idx FROM your_table_name;
若需直接给表新增idx列并赋值:
ALTER TABLE your_table_name ADD COLUMN idx INT; UPDATE your_table_name SET idx = CAST(CONCAT(LEFT(brand, 2), id) AS UNSIGNED);
SQL Server
先将brand转为字符串再截取,拼接后转整数:
SELECT id, brand, CAST(CONCAT(LEFT(CAST(brand AS VARCHAR), 2), id) AS INT) AS idx FROM your_table_name;
新增列并更新:
ALTER TABLE your_table_name ADD idx INT; UPDATE your_table_name SET idx = CAST(CONCAT(LEFT(CAST(brand AS VARCHAR), 2), id) AS INT);
PostgreSQL
用::TEXT转字符串,LEFT()截取后通过||拼接,再转整数:
SELECT id, brand, (LEFT(brand::TEXT, 2) || id)::INT AS idx FROM your_table_name;
新增列并更新:
ALTER TABLE your_table_name ADD COLUMN idx INT; UPDATE your_table_name SET idx = (LEFT(brand::TEXT, 2) || id)::INT;
Oracle
用SUBSTR()截取前两位,拼接后转数字:
SELECT id, brand, TO_NUMBER(SUBSTR(brand, 1, 2) || id) AS idx FROM your_table_name;
新增列并更新:
ALTER TABLE your_table_name ADD idx NUMBER; UPDATE your_table_name SET idx = TO_NUMBER(SUBSTR(brand, 1, 2) || id);
内容的提问来源于stack exchange,提问作者DaCard
相关产品推荐
相关产品推荐

