Sql 对于特定值,只允许向表中添加3行

Sql 对于特定值,只允许向表中添加3行,sql,oracle,insert,sql-insert,Sql,Oracle,Insert,Sql Insert,我手头有一个问题,我需要限制分配给经理的项目数量仅为3个。各表如下: Manager: Manager_employee_id(PK) Manager_Bonus Project: project_number(PK) Project_cost Project_manager_employee_id(FK) 有人能建议采取什么方法来实现这一点吗?我会做以下几点: 创建新列projects\u take(tinyint)(1)(获取1、2或3)的默认值0 当经理接受项目时,该字段将增加1 执行

我手头有一个问题,我需要限制分配给经理的项目数量仅为3个。各表如下:

Manager:
Manager_employee_id(PK)
Manager_Bonus

Project:
project_number(PK)
Project_cost
Project_manager_employee_id(FK)

有人能建议采取什么方法来实现这一点吗?

我会做以下几点:

  • 创建新列
    projects\u take
    tinyint
    )(
    1
    )(获取
    1
    2
    3
    )的默认值
    0

  • 当经理接受项目时,该字段将增加
    1

  • 执行简单检查(通过UI)以查看字段
    projects\u take
    是否等于或小于
    3

  • “如何实现对0,3的限制?”

    这需要一个断言,该断言在SQL标准中定义,但在Oracle中未实现。(尽管有)

    您可以做的是使用物化视图来透明地执行它

    create materialized view project_manager
    refresh on commit 
    as 
    select Project_manager_employee_id
            , count(*) as no_of_projects
    from project
    group by Project_manager_employee_id
    /
    
    神奇之处在于:

    alter table project_manager
       add constraint project_manager_limit_ck check 
           ( no_of_projects <= 3 )
    /
    

    我会这样做:

  • 为插入/更新操作创建一个SP
  • 检查是否不存在项目经理员工id(FK)计数<3 然后只进行插入/更新。否则发送抛出错误
    一些建议:1。编写一个函数F来检查它,并在插入/更新
    project
    table时调用F。2.在
    project
    表上使用触发器。您也可以这样做:不必在
    Manager
    project
    表之间放置
    0,n
    关系,您可以将其限制为
    0,3
    @foxcy-这就是如何对约束进行建模的方法。OP询问如何实现这样的约束。我如何实现0,3的限制?这个问题不清楚。你是说正好三个,还是最多三个?请编辑你的问题,不要在评论中澄清。你在最后关卡摔倒了,真是太伤心了。如果我们在添加和填充列时遇到麻烦,为什么不在列上构建一个检查约束来强制执行限制?历史的教训是,依赖应用程序强制执行业务规则不可避免地会导致数据损坏。
    create materialized view log on project