Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在mysql中向一个表添加一个约束,这样一个客户机只能拥有10个产品?_Mysql_Database_Check Constraints - Fatal编程技术网

如何在mysql中向一个表添加一个约束,这样一个客户机只能拥有10个产品?

如何在mysql中向一个表添加一个约束,这样一个客户机只能拥有10个产品?,mysql,database,check-constraints,Mysql,Database,Check Constraints,这个案子是关于一个可以预订电影的客户。但他在任何时候最多只能拥有10部电影。我需要什么样的检查约束才能让它工作 创建我的数据库的代码如下所示: 创建表格类型 (PK_GenreID自动增量(13,1)不为空, GenreNaam文本(20) 主键(PK_GenreID)); 在流派(GenreNaam)上创建唯一索引\u BC00E533\u C727\u 4D6E; 创建表Klant (PK_Klantnummer自动增量(19,1)不为空, Naam文本(20)不为空, Woonpaats文

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

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

创建表格类型 (PK_GenreID自动增量(13,1)不为空, GenreNaam文本(20)

主键(PK_GenreID)); 在流派(GenreNaam)上创建唯一索引\u BC00E533\u C727\u 4D6E; 创建表Klant (PK_Klantnummer自动增量(19,1)不为空, Naam文本(20)不为空, Woonpaats文本(20), 邮政编码文本(6), Huissummer文本(6), Telefoon文本(10), 电子邮件文本(255)

约束主键主键(PK_Klantnummer)); 在Klant(Naam)上创建唯一的索引_6827B6DC_E76F_4B57; 创建表存储服务器 (PK_ReservingId自动递增(13,1)不为空, FK_Klantnummer整数, 保留基准日期, 主键(PK_ReserveringID)

约束KlantReserveringen外键(FK_Klantnummer)在更新级联和删除级联上引用Klant(PK_Klantnummer); 制作桌面电影 (PK_FilmnaamID AUTOINCREMENT(51,1)不为空, FK_GenreID整数, Filmnaam文本(30)压缩, 发布基准日期, Regisseur文本(30), 约束主键主键(PK_FilmnaamID)

约束GenreFilms外键(FK_GenreID)在更新级联上引用流派(PK_GenreID)在删除级联上引用流派(PK_GenreID); 在电影上创建索引PK_FilmnaamID(PK_FilmnaamID); 创建表格Beelddrager (PK_FilmID自动递增(50,1)不为空, FK_FilmnaamID整数, Soort文本(50), 主键(PK_FilmID)

约束FilmsBeelddrager外键(FK_FilmnaamID)在更新级联上引用Films(PK_FilmnaamID)在删除级联上引用Films(PK_FilmnaamID); 创建表Beschadiging (PK_BeschadigingID自动递增(14,1)不为空, FK_FilmID整数, Schade文本(255), 基准日期, 约束主键主键(PK_BeschadigingID)

约束BeelddragerBeschadiging外键(FK_FilmID)在更新级联上引用Beelddrager(PK_FilmID)在删除级联上引用Beelddrager(PK_FilmID); 在Beschadiging上创建索引PK_BeschadigingID(PK_BeschadigingID); 创建表reservingsregel (FK_ReserveringID整数, FK_FilmID整数, 开始日期, Einddatum日期, 约束BeeldDragerReservingsRegel外键(FK_FilmID)在更新级联上引用Beelddrager(PK_FilmID)在删除级联上引用,
约束ReservingReservingsRegel外键(FK_ReservingId)在更新级联上引用Reservingen(PK_ReservingId),在删除级联上引用Reservingen(PK_ReservingId)

对于数据库层来说,这条规则似乎不太适合执行

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

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

一种可能的解决方案是对数据结构进行反规范化。但这是一个非常可怕的想法,我不会详细说明

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

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

  • 了解要在应用程序中进行的插入/更新/删除操作 代码
  • 开始交易
  • 获取对具有基数业务规则限制的数据集的锁
  • 将数据库状态与要进行的更改进行比较
  • 如果它通过了您的规则,则执行SQL
  • 提交事务

  • mysql非常愚蠢,不执行检查约束(它可以解析约束,但不强制执行约束)。您需要使用触发器,或者考虑PoxGRE,它负责检查。