如何声明一个约束来限制持有异物的数量?

发布于 2025-01-16 14:31:28 字数 111 浏览 0 评论 0原文

如果我有2张桌子, 所有者(id,名称) Dog(name, oid),其中外键 Dog(oid) 引用 Owner(oid)

我想知道如何设置一个约束,让 Owner 最多只能拥有 2 条狗?

If I have 2 table,
Owner(oid, name)
Dog(name, oid), where foreign key Dog (oid) references Owner (oid)

I want to know how to set a constraint so that Owner can only own at most 2 Dogs?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

是你 2025-01-23 14:31:28

以下是您正在寻找的触发器的示例,该触发器可以阻止同一主人插入第三只狗。

创建表所有者(
id int 主键,
名称 varchar(10) );
创建表狗(
名称 varchar(10) 主键,
oid 整数,
约束 fk_dog_owner 外键 
     (oid) 引用所有者(id) );
创建或替换触发器dog_max_two
插入狗之前
    对于每一行 
宣布
  狗数(10);
开始 
  选择计数(名称) INTO 狗计数
  来自狗,其中 oid = :NEW.oid;
  IF(狗数>1)
    然后
      RAISE_APPLICATION_ERROR(-20001,
        “每人最多 2 只狗”);
  结束如果;
结尾;
/
INSERT INTO Owner VALUES (1,'Bill');
INSERT INTO dog VALUES ('Rover', 1);
INSERT INTO 狗值 ('男孩', 1);
INSERT INTO 狗值 ('Alfie', 1);
ORA-20001:每人最多 2 只狗
 ORA- 06512

:位于“FIDDLE_HZTJGHLANPRDIFXWPMZS.DOG_MAX_TWO”,第 8 行
ORA-04088: 执行触发器 'FIDDLE_HZTJGHLANPRDIFXWPMZS.DOG_MAX_TWO' 期间出错

从狗中选择*;

<前>姓名 |奥德
:---- | --:
漫游者| 1
男孩| 1

db<>fiddle此处

Here is an example of what you are looking for with a trigger which blocks insertion of a third dog for the same owner.

create table owner(
id int primary key,
name varchar(10) );
create table dog(
name varchar(10) primary key,
oid int ,
constraint fk_dog_owner foreign key 
     (oid) references owner(id) );
CREATE OR REPLACE  TRIGGER dog_max_two
BEFORE INSERT ON dog
    FOR EACH ROW 
DECLARE
  dogCount number(10);
BEGIN 
  Select count(name) INTO dogCount
  From dog where oid = :NEW.oid;
  IF( dogCount > 1 )
    THEN
      RAISE_APPLICATION_ERROR( -20001,
        'maximum 2 dogs per person');
  END IF;
END;
/
INSERT INTO owner VALUES (1,'Bill');
INSERT INTO dog VALUES ('Rover', 1);
INSERT INTO dog VALUES ('Boy', 1);
INSERT INTO dog VALUES ('Alfie', 1);
ORA-20001: maximum 2 dogs per person

ORA-06512: at "FIDDLE_HZTJGHLANPRDIFXWPMZS.DOG_MAX_TWO", line 8 ORA-04088: error during execution of trigger 'FIDDLE_HZTJGHLANPRDIFXWPMZS.DOG_MAX_TWO'

select * from dog;
NAME  | OID
:---- | --:
Rover |   1
Boy   |   1

db<>fiddle here

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文