Mysql 如何在限制为3的情况下插入数据库

Mysql 如何在限制为3的情况下插入数据库,mysql,sql,database,Mysql,Sql,Database,我认为这不是一个简单的限额查询。 我有组织者,他们有类别 每个主办方只能有3个类别。 我的问题是,我有一个页面可以编辑他们的类别,如果我使用常规插入,那么可能会超过3个类别。 一些组织者可能有2个类别,然后选择更新为3个类别 一些组织者可以有3个类别,并更新为2个类别 主办方必须至少有一个类别(由客户端处理) 编辑: 我当前的解决方案当前实施的解决方案是在插入修改的类别之前删除所有类别,然后使用客户端将限制限制限制为3。我正在使用MySQL。数据库标准化如下: organiser

我认为这不是一个简单的限额查询。
我有组织者,他们有类别
每个主办方只能有3个类别。
我的问题是,我有一个页面可以编辑他们的类别,如果我使用常规插入,那么可能会超过3个类别。

  • 一些组织者可能有2个类别,然后选择更新为3个类别
  • 一些组织者可以有3个类别,并更新为2个类别
  • 主办方必须至少有一个类别(由客户端处理)
  • 编辑: 我当前的解决方案当前实施的解决方案是在插入修改的类别之前删除所有类别,然后使用客户端将限制限制限制为3。我正在使用MySQL。数据库标准化如下:

           organiser                                     organiser_categories
      +-------------------+                    +-------------------+--------------+
      |  organiser_email  |                    |  organiser_email  | category_id  |
      +-------------------+                    +-------------------+--------------+
      |  abc@gmail.com    |                    |   abc@gmail.com   |     1        |
      |  xyz@gmail.com    |                    |   abc@gmail.com   |     2        |
      +-------------------+                    +-------------------+--------------+
    
    
                                 categories
                     +---------------+---------------+
                     |  category_id  | category_name |
                     +---------------+---------------+
                     |      1        |    Leisure    |
                     |      2        |    History    |
                     +---------------+---------------+
    

    我确实认为你可以在应用程序站点而不是mysql上进行检查(限制为3类)。这是数据验证的一部分


    当更新到数据库时,我同意您删除所有类别并插入类别。

    我认为您可以在应用程序站点而不是mysql上进行检查(限制为3个类别)。这是数据验证的一部分


    更新到数据库时,我同意您删除所有类别并插入类别。

    我建议您在客户端使用选择限制3限制用户。这是为组织者删除相应数据并重新插入它们的更好方法

    delete from organiser_categories where organizer_email='abc@xyz.com';
    insert into organiser_categories (organiser,category) 
    values ('abc@xyz.com',1), ('abc@xyz.com',3);
    

    我建议您在客户端使用选择限制3来限制用户。这是为组织者删除相应数据并重新插入它们的更好方法

    delete from organiser_categories where organizer_email='abc@xyz.com';
    insert into organiser_categories (organiser,category) 
    values ('abc@xyz.com',1), ('abc@xyz.com',3);
    
    您可以在
    Organizer\u categories
    上定义一个
    插入前
    触发器,如果该组织者的类别总数超过三个,则该触发器将拒绝新记录:

    CREATE TRIGGER limit_organiser_categories BEFORE INSERT ON organiser_categories
    FOR EACH ROW
      IF (
        SELECT COUNT(DISTINCT category_id)  -- prefer COUNT(*) if appropriate
        FROM   organiser_categories
        WHERE  organiser_email = NEW.organiser_email
      ) = 3 THEN
        CALL too_many_categories;           -- call a non-existant procedure
      END IF;
    
    虽然这会强制您对数据库进行限制,我仍然建议在客户端执行类似的检查,以便向用户提供有意义的反馈。

    您可以在插入
    Organizer\u categories
    之前定义一个
    触发器,如果该组织者的类别总数超过三个,则拒绝新记录:

    CREATE TRIGGER limit_organiser_categories BEFORE INSERT ON organiser_categories
    FOR EACH ROW
      IF (
        SELECT COUNT(DISTINCT category_id)  -- prefer COUNT(*) if appropriate
        FROM   organiser_categories
        WHERE  organiser_email = NEW.organiser_email
      ) = 3 THEN
        CALL too_many_categories;           -- call a non-existant procedure
      END IF;
    
    虽然这在数据库中强制了您的限制,但我仍然建议在客户端执行类似的检查,以便向用户提供有意义的反馈。

    选项1: 通过触发器强制执行限制

    利/弊:这将保持数据模型的通用性,如果需要,您可以很容易地更改限制,但会涉及额外的查询(即行计数)

    备选案文2: 通过存储过程执行更新,并在那里强制执行限制

    优点/缺点:与上面类似

    备选案文3: 重新设计您的模型:去掉
    Organizer\u类别
    ,并在
    Organizer
    中添加3个可空FK字段,最多可存储3个类别

    优点/缺点:这可以确保符合限制,而不会造成额外的性能损失,但需要更改查询逻辑,并且在实际发生后将相对难以改进。此外,它包含的信息也比必要的多:类别的“位置”(基于这3个字段中的哪一个表示它)。

    选项1: 通过触发器强制执行限制

    利/弊:这将保持数据模型的通用性,如果需要,您可以很容易地更改限制,但会涉及额外的查询(即行计数)

    备选案文2: 通过存储过程执行更新,并在那里强制执行限制

    优点/缺点:与上面类似

    备选案文3: 重新设计您的模型:去掉
    Organizer\u类别
    ,并在
    Organizer
    中添加3个可空FK字段,最多可存储3个类别


    优点/缺点:这可以确保符合限制,而不会造成额外的性能损失,但需要更改查询逻辑,并且在实际发生后将相对难以改进。此外,它包含的信息比需要的更多:类别的“位置”(基于这3个字段中的哪一个表示它)。

    感谢您的回复。目前,我正在使用Javascript来确保客户端不能选择超过3个类别。删除所有类别并插入更新不是多余的吗?我认为会有一个更优雅的解决方案。删除和插入更新在速度上会比更新快,特别是对于大型数据库。这似乎是有道理的。我在上面的Organizer\category表中省略了它,但有一个自动递增ID字段。我关心的是,该字段的运行超出了内存限制。是否建议删除该ID字段?关于自动递增ID字段的内存限制,这是我从未想过的。但是,在
    Organizer\category表
    中,我看不到任何自动递增ID的需要。我同意很可能不需要ID字段。谢谢。谢谢你的回复。目前,我正在使用Javascript来确保客户端不能选择超过3个类别。删除所有类别并插入更新不是多余的吗?我认为会有一个更优雅的解决方案。删除和插入更新在速度上会比更新快,特别是对于大型数据库。这似乎是有道理的。我在上面的Organizer\category表中省略了它,但有一个自动递增ID字段。我关心的是,该字段的运行超出了内存限制。是否建议删除该ID字段?关于自动递增ID字段的内存限制,这是我从未想过的。但是,在
    Organizer\category表
    中,我看不到任何自动递增ID的需要。我同意很可能不需要ID字段。谢谢。谢谢你的回复和代码示例。正如我对@sel提到的,删除所有内容并再次插入不是多余的吗?这是acc的最佳方法