如何在另一个表中插入一行时自动递增一个表中的值

时间:2013-08-14 10:15:07

标签: sql postgresql triggers auto-increment sql-view

我目前有两张桌子:

Table 1有唯一的ID和计数。

Table 2包含一些数据列和一列,其中唯一ID Table 1的值在其中。

当我在Table 2中插入一行数据时,Table 1中引用唯一ID的行的计数应递增。
希望我清楚自己。我对PostgreSQL和SQL很新,所以我很感激任何帮助如何做到这一点。 =)

1 个答案:

答案 0 :(得分:2)

你可以用triggers实现这一目标 如果您这样做,请务必适当地涵盖所有类型的写入权限。 INSERTUPDATEDELETE 另请注意,TRUNCATE上的Table 2Table 1中的手动编辑可能会破坏数据完整性。

我建议您考虑使用VIEW来返回自动更新的汇总结果。像:

CREATE VIEW tbl1_plus_ct AS
SELECT t1.*, t2.ct
FROM   tbl1 t1
LEFT JOIN  (
   SELECT tbl1_id, count(*) AS ct
   FROM   tbl2
   GROUP  BY 1
   ) t2 USING (tbl1_id)

如果您使用LEFT JOIN,即使tbl1中没有引用,也会包含tbl2的所有行。对于常规JOIN,这些行将从VIEW中省略。

对于表的所有或大部分内容,最快在子查询中首先汇总tbl2然后加入tbl1 - 如上所示。

您也可以直接使用查询,而不是创建视图,如果您只获取一行或只获取一行,则此替代形式的效果会更好:

SELECT t1.*, count(t2.tbl1_id) AS ct
FROM   tbl1 t1
LEFT   JOIN  tbl2 t2 USING (tbl1_id)
WHERE  t1.tbl1_id = 123  -- for example
GROUP  BY t1.tbl1_id     -- being the primary key of tbl1!