MySQL触发函数(在3个不同的表之间)

时间:2019-06-09 19:10:45

标签: mysql database-trigger

我有3个表(写成重要部分,不是全部数据):

tableDeviceStatus

feature_count = IntegerField('Number of features', validators=[DataRequired(), LessThan('effective_rank'), NumberRange(min=1, max=50)])

tableDeviceTrigger

device_id    status
---------    ------
device01     15
device02     20

tableDeviceCommand

device_id    device_operator   device_param   triggered_device   command
---------    ---------------   ------------   ----------------   -------
device01     >                 22             device80           1
device01     <                 18             device87           0
device02     =                 1              device89           1

流量:

  • tableDeviceStatus 更新后,我将创建触发器(AFTER)
  • 如果设备已更新,请检查 tableDeviceTrigger 并按操作员进行比较,然后更新 tableDeviceCommand

例如:

  • device01更新为25。
  • 有2个比较。同时检查,并从25> 22开始,将 tableDeviceCommand .device80更新为1。

我尝试过触发,但是无法解决搜索,比较和执行。 (因为一台设备可以进行多个比较。我几乎为一行创建了一个,但无法像每行那样进行公式化并执行)

1 个答案:

答案 0 :(得分:1)

欢迎堆栈溢出!如果我理解正确,对于tableDeviceStatus中输入的每个新行,您都希望使用tableDeviceTrigger中匹配的@device_id测试每一行。

对于tableDeviceTrigger中的每个匹配行,都要测试它是否符合要求(@status @device_operator @device_param is TRUE)。对于满足这些要求的每一行,请在tableDeviceCommand中添加一行@triggered_device@command

这样的事情有用吗?

INSERT INTO tableDeviceCommand (device_id, command)
-- maybe REPLACE INTO or UPDATE depending on your requirements
(
  SELECT tdt.triggered_device, tdt.command
  FROM tableDeviceStatus tds
  INNER JOIN tableDeviceTrigger tdt on tds.device_id = tdt.device_id
  WHERE
    (tdt.device_operator = ">" and tds.status > tdt.device_param) OR
    (tdt.device_operator = "<" and tds.status < tdt.device_param) OR
    (tdt.device_operator = "=" and tds.status = tdt.device_param)
    -- add additional ORs to test the comparison specified by device_operator
)