for*_*123 5 database oracle plsql
我正在使用 SQL 和 Oracle 数据库,需要一些帮助 - 触发器是我很难理解的东西。
当我将一行插入到表 A 中时,我需要一个触发器,以便它更新表 B 上的一行:特别是主键与刚刚添加到表 A 的行的相应外键匹配的行。
因此,例如表 A 中的列 X 是引用表 B 中的列 Y(主键)的外键。当我向表 AI 添加一行时,需要表 B 的 Z 列在 X 列 = Y 列的行中为其数值添加 1。
根据我对触发器的有限理解,这是我迄今为止在 SQL 中能够得到的,以防万一(我意识到它不是很好,将其视为伪代码):
CREATE OR REPLACE TRIGGER test_trig
AFTER INSERT OR UPDATE ON tableA
FOR EACH ROW
BEGIN
UPDATE tableB
SET columnZ = columnZ + 1
WHERE tableA.columnX = tableB.columnY;
END test_trig;
/
Run Code Online (Sandbox Code Playgroud)
谢谢
尝试这个 :
语法将是
CREATE OR REPLACE TRIGGER test_trig
AFTER INSERT OR UPDATE ON tableA
FOR EACH ROW
BEGIN
UPDATE tableB
SET columnZ = columnZ + 1
WHERE tableB.columnX = :NEW.columnX;
END test_trig;
/
Run Code Online (Sandbox Code Playgroud)
:new.columnX 引用表 A columnX。
足够好的开始。
首先 - 让我们解决这个问题 - 这没有很好地标准化 - 您描述的值似乎应该在运行时计算,而不是在数据操作时计算。
考虑以下:
将 = +1 插入到该列 - 确定
更新=?并不总是对我认为的列+1 - 可能仅当某些其他数据被修改时。例如 - 如果我更新表设置 col1=col1 会怎样。也许你想要的也许不是。
删除=?删除是否意味着该列为-1?
对于语法:
WHERE tableA.columnX = tableB.columnY;
Run Code Online (Sandbox Code Playgroud)
应该
WHERE :new.columnX = tableB.columnY;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14810 次 |
| 最近记录: |