在 INSERT INTO 另一张表时更新一张表
Posted
技术标签:
【中文标题】在 INSERT INTO 另一张表时更新一张表【英文标题】:UPDATE one table upon INSERT INTO another table 【发布时间】:2018-07-09 02:06:40 【问题描述】:我有一个包含两个表的数据库:
设备 温度架构如下:
CREATE TABLE IF NOT EXISTS devices(
device_id serial PRIMARY KEY,
device_name varchar(255) UNIQUE NOT NULL,
last_record_time timestamp without time zone DEFAULT '1995-10-30 10:30:00'
);
CREATE TABLE IF NOT EXISTS temperature(
device_id integer NOT NULL,
temperature decimal NOT NULL,
record_time timestamp without time zone NOT NULL,
CONSTRAINT temperature_device_id_fkey FOREIGN KEY (device_id)
REFERENCES devices (device_id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
);
设备表保存所有设备的列表。所以每个设备都有一个唯一的 id。温度表汇总了所有设备的数据。您可以按 device_id 进行选择以查看与特定设备相关的所有条目。
我有不能从设备表中删除的约束,因为温度表依赖于它。我还希望在将新记录插入温度表时更新设备表。
也就是说,温度中新记录的 record_time 应该成为该设备在 devices 表中的条目的 last_record_time。这样我总是知道设备最后一次插入数据是什么时候。
我目前正在以编程方式执行此操作。我插入记录,然后立即选择它们并写入另一个表。这是引入一些错误。因此,我更愿意在数据库级别自动执行此操作。我该如何解决这个问题?
【问题讨论】:
【参考方案1】:使用触发器的替代方法是 CTE:
WITH ins AS (
INSERT INTO temperature (device_id, temperature, record_time)
VALUES (1, 35.21, '2018-01-30 09:55:23')
RETURNING device_id, record_time
)
UPDATE devices AS d SET last_record_time = ins.record_time
FROM ins
WHERE d.device_id = ins.device_id;
【讨论】:
那么该语句将取代我传统的插入温度表? 是的。这是一个查询。【参考方案2】:使用触发器隐式执行此操作。
在温度表上为诸如插入/删除/更新等事件创建触发器,并在该触发器内更新温度表。
CREATE OR REPLACE FUNCTION update_last_record_time()
RETURNS trigger AS
$$
BEGIN
UPDATE devices
SET last_record_time = NEW.record_time
WHERE device_id = NEW.device_id;
RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';
CREATE TRIGGER my_trigger
AFTER INSERT
ON temperature
FOR EACH ROW
EXECUTE PROCEDURE update_last_record_time();
【讨论】:
不,请仔细阅读问题:也就是说,温度中新记录的record_time应该成为该设备在设备表中的条目的last_record_time......用户想要更新设备表。 ... 需要在温度表中创建触发器 温度表怎么写?触发器。 @mittal ,触发器应写入温度表以进行插入操作,并应更新设备表记录时间 @Nishad,是的,我也是这么说的。见我上一条语句“需要在温度表中创建触发器”【参考方案3】:对于从子表中删除行在创建外键时使用级联删除它会在删除父表记录时自动从子表中删除记录
【讨论】:
我不想删除。当新数据插入温度时,我正在尝试更新一个表以上是关于在 INSERT INTO 另一张表时更新一张表的主要内容,如果未能解决你的问题,请参考以下文章