为两表创建Surrogate Key:Table2仅含Product_ID的场景处理
为Table2生成代理键的解决方案
核心规则适配
Table2仅包含Product_ID,且存在同一Product_ID对应多条记录的情况,需生成匹配Table1风格的代理键,可按以下两种场景处理:
场景1:可关联Table1获取Product_Unique_ID
若能通过Product_ID关联Table1拿到对应的Product_Unique_ID,直接复用Table1的生成逻辑:
- 当关联到的
Product_Unique_ID不为空时,代理键格式为{Product_ID}-{Product_Unique_ID} - 无匹配
Product_Unique_ID或其为空时,代理键直接使用Product_ID
以MySQL为例,SQL语句如下:
-- 新增代理键列 ALTER TABLE Table2 ADD COLUMN surrogate_key VARCHAR(100); -- 关联Table1更新代理键 UPDATE Table2 t2 JOIN Table1 t1 ON t2.Product_ID = t1.Product_ID SET t2.surrogate_key = CASE WHEN t1.Product_Unique_ID IS NOT NULL THEN CONCAT(t2.Product_ID, '-', t1.Product_Unique_ID) ELSE CAST(t2.Product_ID AS CHAR) END;
注:若同一
Product_ID对应多个Product_Unique_ID,需确保Table2的每条记录与Table1的行一一对应(比如补充额外关联条件),避免重复更新。
场景2:无法关联Table1,仅基于Table2内部记录生成
若无法关联Table1,需为Table2中重复的Product_ID生成唯一后缀,保证代理键全局唯一:
- 代理键格式为
{Product_ID}-{序号},序号为同一Product_ID分组内的自增数字 - 若
Product_ID唯一,直接使用Product_ID
MySQL 8.0+/PostgreSQL 实现
-- 新增代理键列 ALTER TABLE Table2 ADD COLUMN surrogate_key VARCHAR(100); -- 用窗口函数生成序号并更新 WITH ranked AS ( SELECT Product_ID, ctid, -- PostgreSQL用ctid,MySQL用主键或唯一标识 ROW_NUMBER() OVER (PARTITION BY Product_ID ORDER BY (SELECT NULL)) AS rn FROM Table2 ) UPDATE Table2 t2 SET surrogate_key = CASE WHEN (SELECT COUNT(*) FROM Table2 WHERE Product_ID = t2.Product_ID) > 1 THEN CONCAT(t2.Product_ID, '-', (SELECT rn FROM ranked WHERE ranked.Product_ID = t2.Product_ID AND ranked.ctid = t2.ctid)) ELSE CAST(t2.Product_ID AS CHAR) END;
SQL Server 实现
-- 新增代理键列 ALTER TABLE Table2 ADD surrogate_key VARCHAR(100); -- 用窗口函数生成序号并更新 WITH ranked AS ( SELECT Product_ID, surrogate_key, ROW_NUMBER() OVER (PARTITION BY Product_ID ORDER BY (SELECT NULL)) AS rn FROM Table2 ) UPDATE ranked SET surrogate_key = CASE WHEN rn > 1 THEN CONCAT(Product_ID, '-', rn) ELSE CAST(Product_ID AS VARCHAR) END;
注意事项
- 若要求代理键全局唯一,需确保同一
Product_ID的后缀(无论是Product_Unique_ID还是自增序号)无重复 - 数据量较大时,关联更新或窗口函数更新可能影响性能,建议分批执行
内容的提问来源于stack exchange,提问作者user23086613
相关产品推荐
相关产品推荐

