【问题标题】:Foreign Key reference in mysql innodbmysql innodb 中的外键引用
【发布时间】:2009-12-24 19:23:15
【问题描述】:

简单地说:我有一个有 2 列的表:一个是用户名,另一个是昵称。 我有另一个表,其中有 2 列:一个是用户名,另一个是 countNicknames。

我希望 countNicknames 包含每个用户拥有的昵称数量(并且每当我向 table1 插入新昵称时,table2.countNicknames 下的值都会自动更新。

你能写下如何构造第二个表来引用第一个表吗?

【问题讨论】:

    标签: sql mysql innodb calculated-columns


    【解决方案1】:

    为什么不只在需要价值的时候计算?

    【讨论】:

      【解决方案2】:

      我希望 countNicknames 包含每个用户拥有的昵称数量(并且每当我向 table1 插入新昵称时,table2.countNicknames 下的值都会自动更新。

      这实际上是视图的作用。

      CREATE OR REPLACE VIEW user_nickname_count AS
          SELECT t.username,
                 COUNT(*) 'countNicknames'
            FROM TABLE t
        GROUP BY t.username
      

      一个视图看起来像一张桌子,所以如果需要你可以加入它。唯一的开销是它实际上只是运行一个 SELECT 查询 - 值是按需计算的,而不必设置触发器。

      更多info on views, see the documentation.

      【讨论】:

        【解决方案3】:

        嗯,@Lasse 的建议更好,但是...还有 另外两个其他选项...

        1. MySql 有触发器吗?如果是这样,那么您将在第一个表上添加一个插入、更新、删除触发器,该触发器在每次插入、更新或从第一个表中删除记录时更新(或根据需要插入或删除)第二个表的 CountNickNames 属性。 .

          在 NickNameCountTable 上创建触发器 NickNameCountTrig 用于插入、更新、删除 作为 更新 nct 集 CountNickNames = (从 FirstTable 中选择 Count() 其中名称 = nct.Name) 来自 NickNameCountTable nct 名称在哪里(从插入的选择不同的名称 联盟 从已删除中选择不同的名称) -------------------------------------------------- 插入 NickNameCountTable(名称,CountNickNames) 从 FirstTable ft 中选择名称,count() 不存在的地方 (从 NickNameCountTable 中选择 * 其中名称 = ft.Name) -- ------ 这是可选的 ----------- 删除 NickNameCountTable 其中 CountNickNames = 0

        2. MySql 是否有索引视图(或某些等价物)?显然不是 - 所以不要介意这个选项....

        【讨论】:

        • MySQL 没有索引/物化视图。即便如此,由于某些奇怪的原因,MySQL 视图也不允许在其中进行子查询。
        猜你喜欢
        • 2015-05-12
        • 1970-01-01
        • 1970-01-01
        • 2021-04-29
        • 1970-01-01
        • 2016-03-19
        • 2012-04-23
        • 2010-12-07
        • 1970-01-01
        相关资源
        最近更新 更多