【问题标题】:Check constrain with 2 tables用 2 个表检查约束
【发布时间】:2017-03-16 01:28:38
【问题描述】:

我有两张桌子:bedsroom,我想确保在插入时每个房间最多可以有 5 张床(即公司总共拥有 50 张床,可以从一个房间换到另一个房间各种组合,但每个房间最多只能有5个)。

beds 中的主键是room_idbed_id 的组合键(room_id 是外键),但我不确定如何将其作为表的约束来实现?

以下表格

CREATE TABLE "ROOM"
   ("ROOM_NO" NUMBER(*,0), 
    "ROOM_NAME" VARCHAR2(45 CHAR) NOT NULL ENABLE, 
     CONSTRAINT "ROOM_NO_PK" PRIMARY KEY ("ROOM_NO")



CREATE TABLE "BED" 
   ("ROOM_NO" NUMBER(*,0), 
    "BED_NO" NUMBER(*,0), 
     CONSTRAINT "BED_PK" PRIMARY KEY ("ROOM_NO", "BED_NO")

我是 sql 新手,还没有涉及到触发器和序列,请您简单地解释一下如何做到这一点?

【问题讨论】:

  • 我认为你需要一个触发器来管理这个。
  • 或让它从应用程序控制超过全局阈值
  • 我同意@GordonLinoff 这可以通过触发器解决。如果您需要有关触发器解决方案的帮助,您应该提供一些示例表结构、数据并更清楚地描述预期行为。
  • @Plirkee 一家酒店的商店有 50 张床位,编号从 1 到 50,但我想确保一个房间可以拥有商店中任意数量的床位。编号从 1 到最大 5。所以房间 1 可以有床 1、床、2,然后房间 2 会有床 1 床 2 床 3 床 4 所以房间 1 中的床 1 和房间 2 中的床 1 应该不同床(我希望这是有道理的。

标签: sql oracle


【解决方案1】:

好的,根据您的评论,我会稍微修改一下方法

我们开始吧:

    CREATE TABLE "BED" 
   (
    "BED_NO" NUMBER(*,0), 
    "ROOM_NO" NUMBER(*,0), 
    "BED_ROOM_SN" NUMBER(*,0),   

     CONSTRAINT "BED_PK" PRIMARY KEY ("BED_NO"),
     CONSTRAINT rm_fk FOREIGN KEY ("ROOM_NO") REFERENCES "ROOM",
     CONSTRAINT chk_beds CHECK ("BED_ROOM_SN" IN (1,2,3,4,5)),
     CONSTRAINT constraint_name UNIQUE ("ROOM_NO", "BED_ROOM_SN")
    )

我会解释:

BED 表包含:

  • BED_NO(床序列号,也是这个表的一个键……在你的 案例 - 数字1..50)
  • ROOM_NO - 房间号(外键,引用ROOM 表)

  • BED_ROOM_SN - 房间内床的SN,只能从15

  • 此外,一个房间只能有一张第一张床、一张第二张床等 - 因此unique (Room_no,BED_ROOM_SN)

关于标准化,这里我们有one-to-many 关系(一个room 有很多beds,但是一个bed 只对应一个room),这就是为什么room 的键是@ 987654338@转bed表。

【讨论】:

  • 这是我最初使用的表格结构,但问题特别要求床和房间在标准化后位于单独的表格中。
  • @user3185534 您在问题中提到过吗?因为我使用的是您问题中给出的表格,只是添加了一个额外的约束。我没有关注......你到底是什么意思'床和房间在正常化后分开'?
  • 感谢您的帮助..这似乎解决了问题。
猜你喜欢
  • 2011-01-28
  • 2018-08-04
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多