MySQL根据一个表的条件插入两个表之一

时间:2015-11-17 17:12:28

标签: mysql sql

考虑两个具有时间戳和数据列的表。我需要构造一个执行以下操作的SQL:

  • 如果表中没有时间戳值,则在一个表中插入数据(唯一时间戳和数据列)("在表1中插入我的数据以获取时间戳=" 12:00 1999- 01-01"仅当表1中没有该时间戳时...)

  • 否则,在没有任何检查的情况下在不同的表中插入非常相同的数据,并在必要时覆盖(...否则在表2中插入相同的字段集)。

我怎样才能在SQL上实现这一点?我可以使用客户端来做到这一点,但速度要慢一些。我使用MySQL

2 个答案:

答案 0 :(得分:1)

首先运行第二个项目符号的查询。即,如果表1中存在数据,则将数据插入表2中

insert into table2 (data, timestamp)
select 'myData', '12:00 1999-01-01'
from table1
where exists (
    select 1 from table1
    where timestamp = '12:00 1999-01-01'
)
limit 1

然后运行您的第一个项目符号的查询,即只有在数据不存在的情况下插入到表1中

insert into table1 (data, timestamp)
select 'myData', '12:00 1999-01-01'
from table1
where not exists (
    select 1 from table1
    where timestamp = '12:00 1999-01-01'
)
limit 1

运行这两个查询将始终只将1行插入1个表中,因为如果该行存在于table1中,则第二个查询的not exists条件将为false,如果它不存在于table1中,那么第一个查询的exists条件将为false。

您可能需要考虑在table1上创建一个唯一约束来自动防止重复,以便您可以使用insert ignore来插入table1

alter table table1 add constraint myIndex (timestamp);
insert ignore into table1 (data,timestamp) values ('myData','12:00 1999-01-01');

答案 1 :(得分:0)

regural INSERT语句只能将记录插入一个表中。您有两个选择:

  1. 编写应用程序中的逻辑
  2. 在mysql中创建stored procedure并在那里编写应用程序逻辑
  3. 无论你选择哪条路线,我都会

    1. 在两个表中的timestamp列上添加唯一索引。
    2. 尝试将数据插入第1个表格。如果插入成功,一切正常。如果时间戳存在,那么您将收到错误(或者警告取决于mysql配置)。您的解决方案处理错误(在mysql中查看DECLARE ... HANDLER ...)。
    3. 使用INSERT INTO ... ON DUPLICATE KEY UPDATE ...语句将数据插入第二个表,如果时间戳不存在,则会插入数据,如果存在,则更新记录。