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

比较外键-PostgreSQL

  •  1
  • NeoVe  · 技术社区  · 6 年前

    我遇到了这个问题:

    仓库中的库存由以下数据库表中的行表示:

    CREATE TABLE stock (
      id SERIAL,
      product_id integer NOT NULL REFERENCES products ( id ),
      location_id integer NOT NULL REFERENCES locations ( id ),
      package_id integer REFERENCES packages ( id ),
      qty integer
    );
    

    同一包装内的任何产品必须 物理约束,在 仓库。不幸的是,由于应用程序层中的错误,一些 数据库行违反了此约束。

    stock表中大约有200万行。

    编写数据库查询以标识受影响的行。

    现在,我明白了 product_id 是一个外键,以及 location_id package_id stock 但不知怎么的,我对如何实现这一目标感到非常困惑。

    我想的一件事是,将包装与产品进行比较,但我还是被卡住了,因为当产品上的包装相同时,它们的位置应该是相同的。所以,我还没有看到大局。

    我对这件事有点太过火了,哈哈,有什么想法可以接近它吗?

    1 回复  |  直到 6 年前
        1
  •  3
  •   klin    6 年前

    查询应找到由对标识的包 (product_id, package_id) 不止一个 location_id 以下内容:

    select product_id, package_id, count(distinct location_id)
    from stock
    group by product_id, package_id
    having count(distinct location_id) > 1
    

    不幸的是,由于应用程序层中的错误,一些数据库行违反了这个约束。

    不,很遗憾,模型不正确。位置应以包装为参考,而不是以库存为参考。