update set from 以及表 数据的复制 insert into select from ....

本文详细介绍SQL中复制表结构及数据的方法,包括使用INSERT INTO...SELECT FROM进行数据初始化,以及通过UPDATE...INNER JOIN实现数据更新。同时,对比了SELECT INTO FROM与INSERT INTO SELECT的区别,适用于数据库管理员和开发者。

insert into ... select  from ...

工作中的示例: 初始化数据


INSERT INTO "db_gyfw"."t_fa_capz"

( "c_bh", "c_bh_ryfz", "n_bh_fy", "n_hlca", "n_fpcs", "dt_cjsj", "dt_zhgxsj", "n_zsbl" ) 
SELECT
uuid (),
fz.c_bh,
fz.n_bh_fy,
'2',
'10',
now(),
now(),
'0.1' 
FROM
    db_gyfw.t_fa_ryfz fz;

转载其他博主:https://blog.youkuaiyun.com/qq_21612319/article/details/79780822

select into from 和 insert into select都是用来复制表,两者的主要区别为: select into from 要求目标表不存在,因为在插入时会自动创建。insert into select from 要求目标表存在。

    备份表数据: create table emp as select * from scott.emp

    还原表数据:insert into emp select * from scott.emp

    复制表结构及其数据:

    create table table_name_new as select * from table_name_old

    只复制表结构:

    create table table_name_new as select * from table_name_old where 1=2;

    或者:

    create table table_name_new like table_name_old

    只复制表数据:

    如果两个表结构一样:

    insert into table_name_new select * from table_name_old

    如果两个表结构不一样:

    insert into table_name_new(column1,column2...) select column1,column2...

    from table_name_old pasting

 update set from ...

其他博主链接: https://blog.youkuaiyun.com/zeternityyt/article/details/80041794

                          https://www.cnblogs.com/liuqichun/p/4500487.html

 

MySQL 和 SQLSERVER不一样,update set from 一张表的时候 应该改为

UPDATE TABLE_AA INNER JOIN TABLE_BB ON TABLE_AA.ID = TABLE_BB.ID SET NAME = TABLE_BB.NAME

mysql 和postgresql中这样使用

update t_fa_rycs
inner join 
     (select c_bh,n_bh_ry from t_fa_fzry group by n_bh_ry having count(*) =1) s on s.n_bh_ry = t_fa_rycs.n_bh_ry set t_fa_rycs.c_bh = s.c_bh 

示例:

UPDATE BJ_CaiLiao
SET
    Mat_GuiGe = gg.Mat_GuiGe_Title
FROM 
(
SELECT bcl.Mat_Id,bcl.Mat_GuiGe
,ma.Mat_GuiGe_ID
,mgg.Mat_GuiGe_ID AS Mat_GuiGe_ID1,mgg.Mat_GuiGe_Title 
FROM BJ_CaiLiao bcl
LEFT JOIN Mat_Attach ma ON ma.Mat_Id = bcl.Mat_Id
LEFT JOIN Mat_GuiGe mgg ON mgg.Mat_GuiGe_ID = ma.Mat_GuiGe_ID
) gg

WHERE BJ_CaiLiao.Mat_Id = gg.Mat_Id;

第二种方式

UPDATE "db_gyfw".t_fa_rycs cs,
(
SELECT COUNT
    ( ry.n_bh_ry ),
    ry.n_bh_ry,
    cs.c_bh csbh,
    ry.c_bh rybh 
FROM
    "db_gyfw".t_fa_fzry ry
    LEFT JOIN t_fa_rycs cs ON ry.n_bh_ry = cs.n_bh_ry 
GROUP BY
    ry.n_bh_ry 
HAVING
    COUNT ( ry.n_bh_ry ) = 1 
    ) s 
    SET cs.c_bh = s.rybh 
WHERE
    cs.n_bh_ry = s.n_bh_ry;

 

 

`INSERT INTO ... ON CONFLICT(...) DO UPDATE SET` 是 PostgreSQL 特有的语句,用于处理插入数据时的冲突情况。当插入的数据违反了唯一约束或主键约束时,可以使用该语句执行更新操作。在实现同时登录和更新功能时,可以结合用户和登录记录来完成。 假设存在两个:`users` 存储用户信息,`login_records` 记录用户的登录信息。`users` 结构如下: ```sql CREATE TABLE users ( user_id SERIAL PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, password VARCHAR(255) NOT NULL ); ``` `login_records` 结构如下: ```sql CREATE TABLE login_records ( record_id SERIAL PRIMARY KEY, user_id INT NOT NULL, login_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE (user_id, login_time::date) -- 确保每天每个用户只有一条记录 ); ``` 以下是使用 `INSERT INTO ... ON CONFLICT(...) DO UPDATE SET` 语句同时实现登录和更新功能的示例: ```sql -- 模拟用户登录验证 WITH login_verification AS ( SELECT user_id FROM users WHERE username = 'your_username' AND password = 'your_password' ) -- 插入或更新登录记录 INSERT INTO login_records (user_id) SELECT user_id FROM login_verification ON CONFLICT (user_id, login_time::date) DO UPDATE SET login_time = EXCLUDED.login_time; ``` 在上述代码中,首先通过 `WITH` 子句进行用户登录验证,查询 `users` 中用户名和密码匹配的用户 `user_id`。然后将验证通过的 `user_id` 插入到 `login_records` 中。如果插入的数据违反了 `(user_id, login_time::date)` 的唯一约束(即该用户当天已经有登录记录),则使用 `ON CONFLICT DO UPDATE` 子句更新登录时间为当前时间。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值