我需要触发器的帮助或类似的东西。
问题是:
我有一个以“ id”为主键的表。 我从第三方应用程序获得的文件仅包含对该表的插入语句(文件生成是定期进行的)。 当我执行文件(文件包含新ID和现有ID)时, a)记录应插入表以获取新ID b)应该对现有ID进行删除插入或更新
答案 0 :(得分:1)
首选方法是将insert语句更改为MERGE语句。但是,当您说“ 我从第三方应用程序获得的... ”时,我认为您无法更改它们。
在这种情况下,请从您的表中创建一个视图,即简单的CREATE VIEW ... AS SELECT * FROM YOUR_TABLE;
然后您可以创建一个INSTEAD OF Trigger,例如
CREATE OR REPLACE TRIGGER update_name_view_trigger
INSTEAD OF UPDATE OR INSERT OR DELETE ON ...
BEGIN
IF INSERTING THEN
MERGE INTO ... D
USING (SELECT :new.ID, :new.x, :new.Y, :new.Z FROM dual) S
ON (D.ID = S.ID)
WHEN MATCHED THEN UPDATE SET ...
WHEN NOT MATCHED THEN INSERT ...;
ELSIF DELETING THEN
NULL; -- do nothing for delete
ELSIF UPDATING THEN
UPDATE ... SET ...
WHERE ID = :OLD.ID;
END;
答案 1 :(得分:0)
因此,您有一个包含INSERT
语句的脚本,但是只应插入新数据,而应“更新”更新。
立即的响应是将MERGE
语句替换为INSERT语句,这可以使用sed + awk
来实现,但是看不到我们不知道的脚本和表格格式。
或者另一种方法是对脚本中的grep
值进行ID
,并在DELETE
之前为这些INSERT
生成一个块。 / p>
同样,没有脚本中的代码示例,我无法给出任何有关如何执行此操作的代码。
假设您的表名为the_app_table
,则可能会采用以下更为精细的方法:
-- CREATE A table based on INSERT target
CREATE TABLE the_temp_table AS SELECT * FROM the_table WHERE 1 = 2;
现在将文件sed更改为临时表的目标名称:
sed 's/the_target_table/the_temp_table/' the_script.sql > the_new_script.sql
运行此新脚本,它将把数据插入到临时表中。
从MERGE
到the_temp_table
向UPSERT写一条the_app_table
语句。