i当前使用收集路由器接口数据的DBI
模块在Perl脚本中具有插入语句。它每次都起作用,但显然有唯一的约束错误,因为脚本重新运行时存在某些项目。我试图进行合并,但是我不确定如何通过不像我见过的示例那样从另一个表中选择数据来做到这一点。为了更好地理解,Perl脚本通过将ssh
运行到设备并将某些信息存储到变量中来收集数据。例如,接口名称为$interface
。等。
当前的插入语句
$dbh->do("INSERT INTO table VALUES (?, ?, ?, ?, ?)", undef, $interface, $id, $device, $description, $user);
我开始编写合并功能,但是我似乎无法掌握它的工作方式,因为所有合并语句都从其他表和匹配数据中选择,然后进行更新/插入?下面的示例从2个不同的表和匹配中选择数据,但是我只是在看一个表并要合并新数据。
MERGE INTO bonuses D
USING (SELECT employee_id, salary, department_id FROM employees
WHERE department_id = 80) S
ON (D.employee_id = S.employee_id)
WHEN MATCHED THEN UPDATE SET D.bonus = D.bonus + S.salary*.01
DELETE WHERE (S.salary > 8000)
WHEN NOT MATCHED THEN INSERT (D.employee_id, D.bonus)
VALUES (S.employee_id, S.salary*.01)
WHERE (S.salary <= 8000);
因此,它将数据合并到bonuses
中,但与员工匹配。即使这样的语句会起作用,甚至可以在Perl脚本中使用这样的语句?
在您的情况下,这样的 MERGE
语句应该起作用。请注意,我正在从DUAL
表中选择一个记录。您可以将DUAL
的多个UNION ALL
s用于多行。
MERGE INTO yourtable target
USING (SELECT 1 AS id, 'value_1' AS column_1, 'value_2' AS column_2
FROM DUAL) source
ON (source.id = target.id)
WHEN MATCHED
THEN
UPDATE SET
target.column_1 = source.column_1, target.column_2 = source.column_2
WHEN NOT MATCHED
THEN
INSERT (column_1, column_2)
VALUES (source.column_1, source.column_2);