代码之家  ›  专栏  ›  技术社区  ›  zsharp

保存来自另一个表的行计数的表字段

  •  2
  • zsharp  · 技术社区  · 15 年前

    我有一个字段,希望在其中存储另一个表中的特定行数。在创建行时,我一直在增加这个值,但我觉得这可能不是最好的方法。再说一次,我认为每次在有问题的桌子上“数数”也没有意义。什么是最好的方法?

    编辑:

    6 回复  |  直到 15 年前
        1
  •  2
  •   Community Jaime Torres    7 年前

    创建 插入 触发 增加产品数量。

    alt text

    这是密码

    create table Products ( ID int identity primary key )
    GO
    create table ProductCounter ( ProductCount int not null default 0 )
    GO
    insert ProductCounter default values
    GO
    create trigger trgIncrementProductCount
    on Products
    after insert
    as
    begin
        update  ProductCounter
        set ProductCount = ProductCount + 1
    end
    GO
    
    insert Products default values
    insert Products default values
    select * from ProductCounter
    
    insert Products default values
    insert Products default values
    select * from ProductCounter
    
        2
  •  1
  •   Chris    15 年前

    如果是它的sql server,则可以为insert和delete设置触发器,以增加/减少该值。

    或者你可以为它做一个视图。

    或者,就像我会做的,每次都做计数,除非它是一张大桌子。

        3
  •  1
  •   Jim H.    15 年前

    如果您要查找的值是第一个表中的行数,那么与插入/更新第二个表,然后从中查询值的开销相比,这将是一个成本低得多的操作。

        4
  •  1
  •   MrTelly    15 年前

    注意这是一个特定的Sql Server答案,首先我不确定

    select count(*) from table 
    

    真的做了一个完整的表扫描,执行计划说它做了。如果是这样,那么您可以使用系统表查找表中的行数,这将更快,尤其是在大型表上。

    select rowcnt from sysindexes
    inner join sysobjects on sysobjects.id = sysindexes.id
    where xtype='U'
    and sysobjects.name = 'YourTableName'
    and indid = 0
    

        5
  •  1
  •   yukondude    15 年前

    虽然在理想世界中,您永远不想在数据库中存储计算出的值,但在现实世界的泥泞中,常常有必要这样做。

    所以克里斯的建议是你最好的选择。您可能需要在每次触发器调用后重新查询计数,因为可能不总是能够知道插入或删除了多少行(取决于RDBMS),如果一个INSERT或DELETE语句可能影响多个计数,则可能需要多个查询。

    而且,由于还要计算特定行,因此还需要一个UPDATE触发器,以防您的count筛选器所依据的值之一发生更改。

    因此,一个或多个触发器(您可以将其打包成一个INSERT/UPDATE/DELETE触发器)可能会变得非常复杂。

        6
  •  1
  •   jerebear    15 年前

    这个行计数需要多长时间一次?有没有可能每几个小时运行一次cron之类的东西来更新?简单地从表中选择COUNT(ID)…yada yada。它不会依赖于每次查询后的附加更新。