语法:
insert into 表2(表2的字段1,表2的字段2....) select 表1的字段1,表1的字段2.... from 表1 (此处也可left join关联其他表) where 条件
例子:
我新建了一张表,需要把以前的表的数据全部迁移过来,但是只需要部分字段。
insert into t_ref_order_sku (id, order_no, goods_id, sku_id, sku_price, sku_num, prm_amt, status, remarks, del, ct, cu, lmt, lmu)
select t1.id, t1.order_no, t1.goods_id, t1.sku_id, t2.c_price, 1, 0, '0', '', 0, t1.ct, t1.cu, t1.lmt, t1.lmu
from t_order t1 left join t_sku t2 on t2.id = t1.sku_id
where t1.goods_id is not null and t1.sku_id is not null
order by t1.id;
注意:执行了记得提交事务 !!!
问题:
但是这里遇到一个问题,就是新表的主键sequence,如果不插入id,那么数据就会因为主键约束的原因插入不进去,如果把上方的select 后面的 t1.id 改成 seq_t_ref_order_sku.nextval(新表sequence自增),语法是不支持的。
所以我就将原表的id值直接插入到新表的id中,那么新表的sequence怎么办呢?其实很简单,只需要全部更新一下就好了:
语法:update 表2 set id = 表2的sequence名称.nextval;
例子:update t_ref_order_sku set id = seq_t_ref_order_sku.nextval;
注意:执行了记得提交事务 !!!
附:
新建sequence
语法:
create sequence 名称
minvalue 最小值
maxvalue 最大值
start with 起始值
increment by 每次增量,可以为负数
cache 10
order;
例子:
create sequence seq_t_ref_order_sku
minvalue 1000
maxvalue 9999999999
start with 1000
increment by 1
cache 10
order;
创建了一个名字为 seq_t_ref_order_sku 的sequence,最小值为1000,最大值为9999999999,从1000开始,每次递增量为1
查看当前sequence值:
select seq_t_ref_order_sku.nextval from dual;
修改sequence值:
修改sequence值不能直接修改到指定值,只能修改增量然后执行一次,让sequence值达到我们的目标值。
修改sequence示例:假如当前sequence值1500,我们要改成1200
select seq_t_ref_order_sku.nextval from dual;
先执行一次,看看当前sequence值,假如当前是1500
alter sequence seq_t_ref_order_sku increment by -300;
1500要变成1200,那就需要减少300,所以修改步长为-300
select seq_t_ref_order_sku.nextval from dual;
再执行一次,sequence减300变为1200
alter sequence seq_t_ref_order_sku increment by 1;
然后再将步长设置成每次加1,如果不设置,你每次执行将都是在原值上-300,设置后,每次执行都是在原值上+1
select seq_t_ref_order_sku.nextval from dual;
最后再执行一次,sequence变为1201,ok了