沙滩星空的博客沙滩星空的博客

SQL新增数据总结

INSERT INTO SELECT

INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。

INSERT INTO Websites (name, country)
SELECT app_name, country FROM apps;

ON CONFLICT DO

从来源表SELECT整理出数据,然后插入数据到用户部门关系表。
并指出如果数据已存在(通过ON CONFLICT语句指定),则执行数据更新。

INSERT INTO usercenter."departmentsUsers" (
    "departmentId", 
    "userId", 
    "isMain", 
    "isOwner", 
    "createdAt", 
    "updatedAt"
)
SELECT 
    d.id AS "departmentId",
    u.id AS "userId",
    true AS "isMain",
    (sm.s_lead_flag = 1) AS "isOwner", 
    CURRENT_TIMESTAMP AS "createdAt",
    CURRENT_TIMESTAMP AS "updatedAt"
FROM (
    SELECT 
        s_manager_id + 10000 AS new_user_id,
        s_department_id + 10000 AS new_department_id
    FROM ods.s_manager WHERE s_activate_flag = 1
) ods_data
JOIN usercenter.users u ON u.id = ods_data.new_user_id  -- 通过转换后的用户ID关联
JOIN usercenter.departments d ON d.id = ods_data.new_department_id  -- 通过转换后的部门ID关联
---- WHERE ods_data.s_activate_flag = 1
ON CONFLICT ("departmentId", "userId") 
DO UPDATE SET 
    "isMain" = EXCLUDED."isMain",
    "isOwner" = EXCLUDED."isOwner",
    "updatedAt" = EXCLUDED."updatedAt"
;
  • INSERT INTO ... VALUES:直接插入指定值
  • INSERT INTO ... SELECT FROM:通过查询结果插入数据
  • ​​ON CONFLICT 子句:指定触发冲突的条件(如主键、唯一约束字段)。示例:ON CONFLICT (id) 或 ON CONFLICT ON CONSTRAINT 约束名。
  • DO NOTHING:冲突时放弃插入,不执行任何操作
  • DO UPDATE SET:冲突时更新已存在记录的字段
-- 冲突时更新字段
INSERT INTO employees (id, name, salary)
SELECT id, name, 50000 FROM candidates  -- 通过 SELECT 插入
ON CONFLICT (id) 
DO UPDATE SET 
    salary = EXCLUDED.salary;           -- 使用 EXCLUDED 引用新值

-- 冲突时忽略
INSERT INTO departments (dept_id, dept_name)
VALUES (101, 'HR')
ON CONFLICT (dept_id) 
DO NOTHING;                             -- 冲突时不操作

https://www.runoob.com/sql/sql-insert-into-select.html
未经允许不得转载:沙滩星空的博客 » SQL新增数据总结

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址