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

重复的外键约束-原因

  •  3
  • azp74  · 技术社区  · 16 年前

    我刚在生产中遇到一个表,它有4个外键约束。其中两个约束与另外两个约束完全相同。

    工业工程

    fk1(a_id) references a(id)
    fk2(a_id) references a(id)
    fk3(b_id) references b(id)
    fk4(b_id) references b(id)
    

    我以前从没见过这个…这让我觉得是大错特错,我的直觉是这里一定有一个性能上的冲击(尤其是插入到这个表中)。在本例中,数据库是postgres,但我对人们认为的一般行为感兴趣。

    如果有人经历过一段时间,你想要像这样的外国钥匙,我也会感兴趣的-尤其是因为我打算建议你去掉那些重复的!

    3 回复  |  直到 13 年前
        1
  •  2
  •   gbn    16 年前

    这根本没有任何好处,而且是多余的。实际上,它是需要检查插入或更新\id的fk数的两倍。

    我说把副本放下。

    如果一个有层叠,另一个没有,那么非层叠的一个是重复的(可能不适用于Postgres)

        2
  •  1
  •   Walter Mitty    16 年前

    您有数据库的创建脚本吗?如果你这样做了,脚本可能会揭示为什么 同一约束声明了多次。

    清除多余的声明。我想不出理由不这么做。而且,如果您有一个创建脚本,也可以消除其中的冗余声明。看看会发生什么。

    如果没有创建脚本,可以考虑生成和维护一个。它是管理良好的数据库的重要文档。

        3
  •  1
  •   j0k gauthamp    13 年前
    SELECT
        pc.conname as constraint_name, 
        --conrelid as child_table_id,   
        pclsc.relname as child_table,
        --pc.conkey as child_column_id,
        pac.attname as child_column,
        --confrelid as parent_table_id,
        pclsp.relname as parent_table,
        --pc.confkey as parent_column_id,
        pap.attname as parent_column,   
        nspname as schema_name
    FROM 
        (
        SELECT
             connamespace,conname, unnest(conkey) as "conkey", unnest(confkey)
              as "confkey" , conrelid, confrelid, contype
         FROM
            pg_constraint
        ) pc
        JOIN pg_namespace pn ON pc.connamespace = pn.oid
        -- and pn.nspname = 'panmydesk4400'
        JOIN pg_class pclsc ON pc.conrelid = pclsc.oid
        JOIN pg_class pclsp ON      pc.confrelid = pclsp.oid
        JOIN pg_attribute pac ON pc.conkey = pac.attnum    and pac.attrelid =       pclsc.oid
        JOIN pg_attribute pap ON pc.confkey = pap.attnum and pap.attrelid = pclsp.oid
    
    ORDER BY pclsc.relname
    

    列出所有(包括复制)fk约束,包括复制,