当前位置: 首页 > 知识库问答 >
问题:

如何限制一个表主键应该引用另一个表的确切外键数

黄兴业
2023-03-14

我想将一个表中外键的确切数目引用到另一个表中的一个主键。例如,如果我们得到的确切数目为3,则一个主键应该只连接另一个表中的三个外键。我使用用户表存储用户详细信息,使用产品表存储用户购买产品的详细信息。如果用户表的主键是ID,而产品表的外键是通过用户ID列引用用户表的。一个用户id(用户表中的id列)应限制为产品表中三条记录的确切数量。简单地说,用户最多可以购买三个产品,不能超过三个。我可以在MySQL中这样做吗?

共有1个答案

易焱
2023-03-14

您必须在MySQL中编写触发器才能执行此操作。下面是一个例子:

mysql> DELIMITER ;;

mysql> CREATE TRIGGER limit123 BEFORE INSERT ON Product
FOR EACH ROW BEGIN
    IF ((SELECT COUNT(*) FROM Product WHERE user_id = NEW.user_id) > 2)
    THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Only three products per user allowed';
    END IF;
END;;

mysql> DELIMITER ;

mysql> INSERT INTO Product SET user_id=1;
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO Product SET user_id=1;
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO Product SET user_id=1;
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO Product SET user_id=1;
ERROR 1644 (45000): Only three products per user allowed
 类似资料:
  • 我有两个表两个表名

  • 问题内容: 我正在开发一个将用作其他应用程序的可扩展框架的应用程序。 基本类之一称为节点,节点具有内容。SQL表如下所示: TABLE节点(NodeId int,....等) 表格NodeContentRelationship(NodeId int,ContentType字符串,ContentId int) 开发人员可以扩展应用程序以创建自己的内容类型。 显然,从关系数据库的角度来看,这很不好,因

  • 问题内容: 为简化起见,我有两个使用外键一对一关联的表,例如: 一个用户可能有很多动作,也可能没有。我需要一个sql select来返回在actions表中没有user_id值的用户id。 所以我需要一个返回用户ID 2(Smith)的SQL查询,因为外键值不包含ID 2 我尝试了以下SQL,但它返回了所有用户ID: 问题答案:

  • 问题内容: 我有一个Django Web应用程序,它使用默认的自动递增正整数作为主键。该密钥在整个应用程序中使用,并且经常插入URL中。我不想向公众公开此数字,以便他们可以猜测数据库中用户或其他实体的数量。 这是一个经常性的要求,我已经看到类似问题的答案。大多数解决方案建议对原始主键值进行哈希处理。但是,这些答案都无法完全满足我的需求。这些是我的要求: 我想将主键字段类型保持为整数。 我也不希望每

  • 问题内容: 我试图在其中一个表上创建外键,并在其他模式中引用表的列。 像这样的东西: 由于我获得了必要的赠款,因此效果很好。 现在,我想知道是否有原因不引用其他模式中的表,或者有什么需要注意的地方? 问题答案: 没问题。在表之间建立外键关系时,架构实际上没有任何影响。只要确保适当的人员具有您打算使用的架构所必需的权限即可。

  • 在一个表中有两列可以是来自同一表的外键,这样可以吗? 例如: 我有一个“address”表,表中有列: id,street,city_id,state,country(或id,street,city_id,state_id,state_id) 我有一个'states'表,保存状态和国家:id、name、level 那么我可以把states_id放在地址表的state和country中吗(如上面的括