根据字段插入行
Posted
技术标签:
【中文标题】根据字段插入行【英文标题】:Inserting rows depending on fields 【发布时间】:2016-12-31 20:51:27 【问题描述】:我有一个临时表 Temp_Table,根据它的两个字段,我需要在其他表 Table1 和 Table2 中插入行
这些是实现这些的条件,
如果 Temp_Table.Field1 = Table1.Field1 和 Temp_Table.Field2 > Table1.Field2 然后,将该行从 Table1 移动到 Table2 并将行从 Temp_Table 复制到 Table1。
如果 Temp_Table.Field1 = Table1.Field1 并且 Temp_Table.Field2
如果 Temp_Table.Field1 在 Table1 中找不到任何匹配项,请将 Temp_Table 中的行复制到 Table1。
由于 Table1 和 Table2 都有触发器,所以 output 子句没有用。 Temp_Table 本身可能有 Field1 的重复值,因此需要对每一行进行检查。
我怎样才能仅通过 mysql 实现这一点?
我将尝试展示一些示例数据。所有表都没有自动生成的 id。
表1:
Id Field1 Field2 Field3
0 1 30 Dec 2016 data1
表2:
Id Field1 Field2 Field3
临时表:
Id Field1 Field2 Field3
1 1 29 Dec 2016 data2
2 2 31 Dec 2016 data3
3 2 01 Jan 2017 data4
结果表: 表1:
Id Field1 Field2 Field3
0 1 30 Dec 2016 data1
3 2 01 Jan 2017 data4
表2:
Id Field1 Field2 Field3
1 1 29 Dec 2016 data2
2 2 31 Dec 2016 data3
【问题讨论】:
@GordonLinoff,谢谢你的提醒。我已经相应地更改了标签。 请向我们展示一些示例数据以及最终结果应该是什么样子。 您尝试过简单的 INSERT/SELECT 吗?类似insert into <destination> select <whatever> from <source> where <filter>
@mauro,是的,但是 'where' 子句的 'filter' 给我带来了问题。
12 月 31 日...您是否在 varchar 列中保留日期?
【参考方案1】:
听起来有几个操作需要一起执行,事务是使它们全部工作或全部失败的好方法。
我只提供了伪查询,因为实际使用的查询可能会随着您习惯于尝试做的任何事情而发展。
概念:
存储过程 TRY/CATCH 块 开始/提交/回滚传输 左连接查询以检测缺失记录例子:
begin proc Abc as
begin
begin try
begin tran
--Step 1
Insert Table2 select Table1
Delete from Table1
insert into Table1 select TempTable
--Step 2
insert into Table2 select TempTable
--Step 3
insert into Table1 select TempTable left join Table1
commit tran
end try
begin catch
rollback tran
end catch
end
【讨论】:
以上是关于根据字段插入行的主要内容,如果未能解决你的问题,请参考以下文章