0

大家好,我需要一些帮助来决定插入具有序列号字段的表“商店”的最佳方法。我还需要插入引用 shop.id 的表“shopbranch”和“shopproperties”。

简而言之,我需要插入一个商店记录。然后是以下表中的每个表的两条记录,shopproperty 和 shopbranch,其 shopid (FK) 引用了刚刚创建的 shop.id 字段

我在某处看到我可以将“shop”插入包装在一个名为“insert_shop”的函数中,该函数执行“shop”插入并使用 select 语句返回其 id

然后在另一个插入 shoproperty 和 shopbranch 记录的函数中,我可以调用 insert_shop 函数以返回商店 ID,该商店 ID 可用于作为记录的商店 ID 传入。

您能否让我知道我是否以正确的方式看待这个问题,因为我是新手。

4

1 回答 1

1

解决此问题的一种方法是在三个表上创建一个视图,该视图显示所有三个表中可以插入或更新的所有列。如果您随后在视图上创建INSTEAD OF INSERT触发器,那么您可以像操作表格一样操作视图内容。你可以做同样的事情UPDATE,甚至将两者组合成一个INSTEAD OF INSERT OR UPDATE触发器。然后,您的触发器调用的函数具有三个INSERT语句,将视图上的插入重定向到基础表:

CREATE TABLE shop (
  id serial PRIMARY KEY,
  nm text,
  ...
);

CREATE TABLE shopbranch (
  id serial PRIMARY KEY,
  shop integer NOT NULL REFERENCES shop,
  branchcode text,
  loc text,
  ...
);

CREATE TABLE shopproperties (
  id serial PRIMARY KEY,
  shop integer NOT NULL REFERENCES shop,
  prop1 text,
  prop2 text,
  ...
);

CREATE VIEW shopdetails AS
  SELECT s.*, b.*, p.*
  FROM shop s, shopbranch b, shopproperties p,
  WHERE b.shop = s.id AND p.shop = s.id;

CREATE FUNCTION shopdetails_insert() RETURNS trigger AS $$
DECLARE
  shopid integer;
BEGIN
  INSERT INTO shop (nm, ...) VALUES (NEW.nm, ...) RETURNING id INTO shopid;
  IF NOT FOUND
    RETURN NULL;
  END;
  INSERT INTO shopbranch (shop, branchcode, loc, ...) VALUES (shopid, NEW.branchcode, NEW.loc, ...);
  INSERT INTO shopproperties(shop, prop1, prop2, ...) VALUES (shopid, NEW.prop1, NEW.prop2, ...);
  RETURN NEW;
END; $$ LANGUAGE plpgsql;

CREATE TRIGGER shopdetails_trigger_insert
  INSTEAD OF INSERT
  FOR EACH ROW EXECUTE PROCEDURE shopdetails_insert();

您当然可以使用视图并仅显示三个表中可以插入或更新的列(例如排除主键和外键)。

于 2014-03-15T06:21:04.613 回答