【问题标题】:SQL Constraint/Check on Join tablesSQL 约束/检查连接表
【发布时间】:2013-04-10 03:06:13
【问题描述】:

我有三个表:storeproductstoreproduct

storeproduct 表中的内容并不重要,只要知道store 表中有一个storeIDproduct 表中有一个productID。但是storeproduct 表会跟踪每个store 所具有的不同products。所以storeproduct 表有两列。 storeID 列和 productID 列,都是来自 storeproduct 表的外键。

有没有办法对任何表进行约束或检查,以确保商店的产品必须多于 0 件且少于 50 件。

注意:我不希望 select 语句执行此操作。我只想知道在创建表时是否有办法设置约束或检查。

这样做的目的是,如果已经有 50 个产品(行)具有相同的 storeID,则用户不能将 insert 放入 storeproduct 表中,或者如果删除 storeproduct 表中的 delete row 将导致带有 storeID 的最后一行消失。

storeproduct 表可能如下所示

storeID productID
1       1
1       2
1       3
2       4
2       5
2       6
2       7
3       4
3       2
3       6
3       1
3       8

【问题讨论】:

  • 简短的回答是否定的,您必须使用触发器。
  • 理解这可能只是一种心理锻炼;即使可以,我也不推荐。当客户/用户/您(我们将使用“您”)希望将一种产品限制为仅在 10 家商店中时会发生什么?或者一家商店有 50 种产品,而供应商错误地向您发送了一个全新的产品?最好有一个按商店/产品的限制查找表,并有“软”验证询问用户“你确定吗?”当他们即将跨越你的任意门槛时。如果商店有 51 件商品;你不希望 #51 “迷路”。
  • 感谢迄今为止的投入。是的,我认为这不是一个好主意。我花了很多时间寻找样本/解决方案,似乎上面没有任何内容,这可能意味着一个很好的理由。我只是想确保在我转向其他方法之前这是不可能的。

标签: sql constraints


【解决方案1】:

实际上,根据您的数据库,您可能能够做到这一点。 Oracle(也许还有其他人)提供可以应用约束的物化视图。因此,您可以使用 PRODUCTS_IN_STORES 列创建 MV(类似于select storeID, count(*) as PRODUCTS_IN_STORES from stores left outer join storeproduct on store.storeid=storeproduct.storeid group by store.storeid 。然后对其施加约束,断言 PRODUCTS_IN_STORES 介于 0 和 50 之间或其他任何值。

http://www.sqlsnippets.com/en/topic-12896.html

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:21389386132607

对你来说不是一个完整的答案,而是一些需要思考的东西,希望能让你走上自己的道路。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多