1

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

表格:

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
)

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

4

3 回答 3

1

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

我不知道您是否可以在两个表上设置触发器。通常这不是必需的。与您的情况一样,通常您正在创建父记录和子记录,或者您只是创建现有记录的子记录。

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

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

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

于 2013-01-28T19:04:43.997 回答
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的工作演示。

于 2013-01-28T20:09:36.783 回答
0

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

于 2013-01-28T11:17:47.093 回答