关系“旧”不存在

时间:2016-12-07 09:43:02

标签: postgresql triggers

当我尝试执行此脚本时,出现错误: 错误:关系“旧”不存在。 脚本:

$dsn=$_REQUEST['Device_Serial_Number'];
$sql = "SELECT Device_ID, Energy_kwh, Data_Datetime, Device_Serial_Number FROM ads_device_data WHERE Data_Datetime BETWEEN '2016-12-06' and '2016-12-07' and Device_Serial_Number='$dsn'";
$result = mysqli_query($con,$sql);
$data = [];


if($result)
{
while($row = mysqli_fetch_array($result))
{
    $serial = $row['Device_Serial_Number'];
    $x = $row['Data_Datetime'];
    $y = $row['Energy_kwh'];
    $data[] = ['x' => $x , 'y' => (float)$y];
}
  mysqli_free_result($result);
}
mysqli_close($con);
$json = json_encode($data);

我发现了一些这样的问题,但是他们没有帮助我。 我的触发器:

update organization 
set row_status = 30;

2 个答案:

答案 0 :(得分:2)

对于第一个INSERT,请使用类似

的内容
INSERT INTO organization_history VALUES (OLD.*);

DELETE和第二个INSERT构思错误 - 例如,这会导致organization表格中出现大量不必要的流失。

使用BEFORE触发器,向NEW.version添加1并返回NEW会更好。这将导致在将记录写入表之前调整值。

答案 1 :(得分:0)

您误解了OLDNEW的内容:那些不是表,是已插入或修改过。

但是您不需要删除并插入所有内容。只需在 BEFORE 触发器中增加版本。

然后您可以将触发器简化为:

create or replace function pmigratedatatohistory()
returns trigger as $$
BEGIN
  insert into organization_history values (old.*);
  new.version := new.version + 1; -- increment the version
  return new;
END;
$$ 
LANGUAGE plpgsql;

您需要 BEFORE 触发器:

create trigger trmigratedatatohistory BEFORE update or delete ON organization
    for each row execute procedure pmigratedatatohistory();

删除行时的过程对我没有意义。当前代码执行以下操作:

  1. 执行delete from organization并删除该行
  2. 触发器会复制该行
  3. 触发器会尝试删除该行 (并且什么也不做,因为它是after触发器,因此该行已经从表中消失了)
  4. 装配工重新插入应该使用更高版本号删除的行 - 基本上完全恢复删除。
  5. 通过简单地递增before触发器中的版本,可以实现相同的行为。如果您想完全阻止删除,只需在之前的触发器中返回null

    create or replace function pmigratedatatohistory()
    returns trigger as $$
    BEGIN
      insert into organization_history values (old.*);
      new.version := new.version + 1; -- increment the version
      if TG_OP = 'DELETE' then 
        return null; -- "cancel" the delete 
      else
        return new;
      endif;
    END;
    $$ 
    LANGUAGE plpgsql;