我可以使用一个查询将INSERT / UPDATE插入/更新为两个表吗?

时间:2011-08-17 14:35:57

标签: mysql sql

这是我用于基于Perl的Web应用程序的SQL的一大块。我有许多请求,每个请求都有一些加入,每个都有一个状态。这个代码块用于更新每个accession_analysis的表,该分析为请求中的每个加入共享所有这些字段。

UPDATE accession_analysis
SET analysis_id = ? ,
    reference_id = ? ,
    status = ? , 
    extra_parameters = ?
WHERE analysis_id = ?
AND reference_id = ?
AND status = ?
AND extra_parameters = ?
and accession_id is (
    SELECT accesion_id
    FROM accessions
    where request_id = ?
    )

我已经更改了表,因此有一个accession_analysis的状态表,所以当我更新时,我更新了accession_analysis和accession_analysis_status,它们具有status,status_text和accession_analysis的id,这是一个非null的auto_increment变量。 / p>

我不清楚如何修改此代码以允许此操作。我的第一个传递抓住了所有的种质并通过它们循环,然后过滤所有的字段,然后更新。我不喜欢这样,因为我有很多与短SQL命令的连接,我知道这很糟糕,但我不禁想到真正做到这一点的唯一方法是回到Perl中的循环,让两个更简单SQL语句。

有没有办法在SQL中执行此操作,由于我的相对SQL缺乏经验,我只是没有看到?

3 个答案:

答案 0 :(得分:2)

如果这主要是关于连接速度,那么你有一个选择就是编写一个透明地处理“双重更新或插入”的存储过程。有关存储过程,请参阅手册:

http://dev.mysql.com/doc/refman/5.5/en/create-procedure.html

否则,您可能无法在一个语句中执行此操作,请参阅MySQL INSERT语法:

http://dev.mysql.com/doc/refman/5.5/en/insert.html

UPDATE语法允许多表更新(但不与INSERT结合使用):

http://dev.mysql.com/doc/refman/5.5/en/update.html

答案 1 :(得分:2)

答案取决于您使用的DBMS。最简单的方法是在一个表上创建一个触发器,该表提供更新另一个表的逻辑。 (对于任何数据库新手 - 触发器是附加到DBMS(非应用程序)层的表的过程代码,该表运行以响应表上的插入,更新或删除。)。一个类似的,稍微不太理想的方法是将逻辑放在存储过程中并执行它而不是您现在使用的更新语句。

如果您使用的DBMS不支持这些机制中的任何一种,那么在保证事务完整性的同时,没有一种好方法可以完成您所追求的目标。但是,如果您正在解决的问题可以容忍两个表更新中的时间差异(即其中一个表中的数据仅在预定时间使用,如报告或某种类型的批处理操作),您可以写入一个表(实时)并创建一个单独的进程,该进程在需要(稍后)运行时使用第一个表中的数据更新第二个表。然而,允许在不同时间更新数据的正确性成为一个庞大且不可移动的设计假设。

答案 2 :(得分:1)

每个表在查询中都需要自己的INSERT / UPDATE

事实上,即使您通过JOIN多个表创建视图,当您INSERT进入视图时,您只能INSERT使用属于其中一个表的字段一段时间。

  

INSERT语句所做的修改不会影响视图的FROM子句中引用的多个基表。例如,进入多表视图的INSERT必须使用仅引用一个基表中的列的column_list。有关可更新视图的更多信息,请参阅CREATE VIEW。

UPDATE

也是如此
  

UPDATE语句所做的修改不会影响视图的FROM子句中引用的多个基表的。有关可更新视图的更多信息,请参阅CREATE VIEW。

但是,每个查询或存储过程可以有多个INSERTUPDATE个。