我有一个使用jdbc插入的两个表。例如,parcelsTable
和filesTable
我有一些情况:
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
这是可能的?如何知道我在两个表中插入?
答案 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)
我现在唯一的想法就是你可以创建对表进行间接插入的函数。然后你可以得到你需要的任何条件,也可以使用平行插入。