1

我不认为这是一个简单的LIMIT查询。
我有有分类的组织者。 每个组织者只能有 3 个类别。 我的问题是我有一个页面来编辑他们的类别,如果我使用常规的 INSERT,那么它可能会超过 3 个类别。


  1. 有些组织者可能有 2 个类别,然后选择更新为 3 个。
  2. 一些组织者可以有 3 个类别,并更新为有 2 个。
  3. 组织者必须至少有 1 个类别(这是在客户端处理的)。

编辑:目前实施的解决方案是在插入修改的类别之前删除所有类别,然后使用客户端将限制限制为 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    |
                 +---------------+---------------+
4

4 回答 4

2

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

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

于 2012-07-03T08:50:56.213 回答
2

选项1:

通过触发器强制执行限制。

优点/缺点:这使数据模型保持通用,并且您可以在必要时轻松更改限制,但涉及额外的查询(即行计数)。

选项 2:

通过存储过程进行更新,并在那里实施限制。

优点/缺点:与上述类似。

选项 3:

重新设计您的模型:去掉organiser_categories并添加 3 个可 NULL 的 FK 字段organiser以存储多达 3 个类别。

优点/缺点:这确保了符合限制而没有额外的性能损失,但需要更改查询逻辑,并且事后发展相对困难。此外,它包含比必要更多的信息:类别的“位置”(基于这三个字段中的哪一个代表它)。

于 2012-07-03T09:07:17.657 回答
1

我建议您在客户端使用选择限制 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);
于 2012-07-03T08:53:12.950 回答
1

如果该组织者的类别总数超过三个,您可以定义一个拒绝新记录的BEFORE INSERT触发器:organiser_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;

虽然这会强制您对数据库进行限制,但我仍然建议在客户端执行类似的检查,以便为用户提供有意义的反馈。

于 2012-07-03T09:07:03.457 回答