如何在两个表上触发?

时间:2013-01-28 10:50:37

标签: sql postgresql

我有一个使用jdbc插入的两个表。例如,parcelsTablefilesTable我有一些情况:
1.在两个表中插入新行。
2.仅在parcelsTable中插入新行。

TABLES:

DROP parcelsTable;
CREATE TABLE(
 num serial PRIMARY KEY,
 parcel_name text,
 filestock_id integer
)


DROP filesTable;
CREATE TABLE(
 num serial PRIMARY KEY,
 file_name text,
 files bytea
)

当我使用TRIGGER在两个表中进行INSERT时,我想设置parcelsTable.filestock_id=filesTable.num 这是可能的?如何知道我在两个表中插入?

3 个答案:

答案 0 :(得分:1)

这可能不是一个答案,但它可能是你需要的。我这是一个答案而不是评论,因为我需要空间。

我不知道你是否可以在两张桌子上触发。通常这不是必需的。在您的情况下,通常要么创建父记录和子记录,要么只是创建现有记录的子记录。

因此,通常情况下,如果在创建两者时需要触发器,则将触发器放在父记录上就足够了。

我认为你不能做你需要的。您要做的是在同一事务中使用父记录主键填充外键。我认为你不能这样做。我认为你必须在parcelsTable的插入中提供外键。

当您在filesTable中未创建记录时,在parcelsTable中创建记录时,最终会留下此NULL。所以我想你会想要在INSERT语句中设置外键。

答案 1 :(得分:1)

在这种情况下,您无需使用触发器来获取外键值。由于您已将其设置为serial,因此您可以使用currval访问最新值。从你的应用程序运行这样的东西:

insert into filesTable (file_name, files) select 'f1', 'asdf';
insert into parcelsTable (parcel_name, filestock_id) select 'p1', currval('filesTable_num_seq');

请注意,这只应在每次插入一条记录时使用,以从currval中获取单个键值。我正在调用table_column_seq的默认序列名称,除非您明确声明了不同的内容,否则您应该可以使用它。

我还建议明确宣布可空性和关系:

CREATE TABLE parcelsTable (
  ...
  filestock_id integer NULL REFERENCES filesTable (num)
);

以下是SqlFiddle的工作演示。

答案 2 :(得分:0)

我现在唯一的想法就是你可以创建对表进行间接插入的函数。然后你可以得到你需要的任何条件,也可以使用平行插入。