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

如何在mysql中为一个表添加一个约束,这样一个客户端只允许拥有10个产品?

佟英武
2023-03-14

这个案子是关于一个客户谁可以预订影片。但他在任何时候最多只能拥有10部影片。我需要什么检查约束来让它工作?

创建我的数据库的代码如下:

创建表类型(PK_GenreID AUTOINCREMENT(13,1)非空,genreNAM文本(20),

创建表Klant(PK_Klantnummer AUTOINCREMENT(19,1)不为空,Naam文本(20)不为空,Woonplaats文本(20),邮政编码文本(6),Huisnummer文本(6),Telefoon文本(10),Email文本(255),

创建表Reserveringen(PK_ReserveringID AUTOINCREMENT(13,1)NOT NULL,FK_Klantnummer整数,Reserveringsdatum日期,主键(PK_ReserveringID),

创建表Films(pk_filmnaamidautoincrement(51,1)不为空、FK_GenreID整数、带压缩的Filmnaam文本(30)、Releasedatum DATE、Regisseur文本(30)、CONSTRAINT PrimaryKey主键(PK_FilmnaamID),

创建表Beelddrager(PK_FilmID AUTOINCREMENT(50,1)NOT NULL、FK_FilmnaamID INTEGER、soot TEXT(50)、主键(PK_FilmID),

创建表beschading(PK_BeschadigingID AUTOINCREMENT(14,1)NOT NULL,FK_FilmID INTEGER,Schade TEXT(255),Datum DATE,CONSTRAINT PrimaryKey主键(PK_BeschadigingID),

创建表Reserveringsregel(FK_ReserveringID INTEGER,FK_FilmID INTEGER,Begindatum DATE,Einddatum DATE,约束BeelddragerReserveringsregel外键(FK_FilmID)在删除级联时更新级联时引用Beelddrager(PK_FilmID),约束ReserveringenReserveringsregel外键(FK_ReserveringID)在删除级联时更新级联时引用Reserveringen(PK_ReserveringID));

共有1个答案

夏法
2023-03-14

这个规则听起来不适合数据库层执行。

引用完整性功能(唯一键和它们的外键)不能单独解决这一问题。

一个可能的解决方案是在尝试任何违反所需基数的插入、更新或删除时使用触发器短路(抛出异常)。然而,mysql在这方面的功能相当不足(取决于版本)。此外,触发器通常是一个坏主意,尤其是在执行您建议的波动业务规则时。

一个可能的解决方案是使您的数据结构去规范化。但这是一个非常可怕的想法,我不想详谈。

一个可能的解决方案是维护关于集合基数的元数据,然后在执行更改时使用元数据。这会变得很棘手,并最终失败,因为应用程序代码必须完美地保持元数据的最新性。这种模式经常被实现,但也经常失败。

最终,最好的解决方案是在应用程序代码中正确使用事务。一般的流程是这样的:

  1. 知道要在应用程序代码中进行的插入/更新/删除
  2. 开始事务
  3. 获取对基数有业务规则限制的数据集的锁
  4. 将数据库状态与您要进行的更改进行比较
  5. 如果它通过了您的规则,请执行SQL
  6. 提交事务
 类似资料:
  • 我有一个包裹 现在我想禁止在之外的实现,但是应该是公共的,因为我将其用于。 如何做到这一点? 这有什么“套餐最终模式”吗? 你有过这样的情况吗? 详情: 我知道有可能只使用带有包私有构造函数的抽象类,而不是接口,但是和扩展不同的类,因此我需要多重继承(因为模拟多重继承(例如,见有效的Java项目18)在这里不起作用)。

  • 问题内容: 我想向现有表中添加2个新列。 其中之一应具有默认值 0 (也应填写在现有行中)。 我尝试了以下语法: 但这会引发异常。我应该怎么写? 问题答案: 您可以使用此: 或这个: 更多:ALTER TABLE

  • 问题内容: 我想使我的网站一次只允许一个会话。例如,假设用户已经登录到我在firefox上的网站,如果该用户再次登录到另一台浏览器(例如同一台计算机或另一台计算机上的Opera),则Firefox上的会话将被破坏。但是,如果仍为一届会议,则有关Firefox的会议仍将保留。我可以知道该怎么做吗?我正在使用php和apache。谢谢。 问候。本杰明 问题答案: 我建议您做这样的事情: 假设用户“ A

  • 问题内容: 我在SQL Server 2008数据库中具有以下表: tblItem ,它具有一个 ItemID 字段; tblGoodItem ,它也有一个ItemID字段,并且有一个指向tblItem的外键; tblBadItem ,它也具有ItemID字段,并且还具有指向tblItem的外键。 一个项目不能同时是好项目和坏项目。它必须是一个或另一个。但是,无论该项目是好是坏,它都必须是一个项目

  • 问题内容: 我有一张桌子: 现在,我想使列的 用户,电子邮件,地址 唯一(在一起)。 如何在MySql中执行此操作? 当然,这个例子仅仅是……一个例子。因此,请不要担心语义。 问题答案:

  • 问题内容: 我打算开发一个可在内显示一些动态数据的应用程序。所以我决定 在main中添加一个 。这是我的应用程序代码: 我的主要活动: 它是布局文件: 在这个rec​​yclerView内部还有另一个: 他们的适配器Main(RAdapter): 和第二个适配器: 我的问题是:正如您在CAdapter中看到的那样,仅显示构造函数的Log消息。 更新:如果有另一种方法可以在另一张动态卡中显示某些动态