mysql - 有条件地插入表的方法(MariaDB)
问题描述
这个问题涉及应该如何处理对表的条件插入。
假设我们是客户和员工。一次只能为客户分配 4 名员工。我们稍后会回到这个话题。
在数据库级别,我们有检查和触发器。
在 MariaDB 中,CHECK 约束不能有子查询,因此我们不能以这种方式对参与程度施加约束。例如,我们不能说类似
CHECK ( customer_id IN (SUBQUERY that returns count of Employees with == 4 employees) )
.
触发器可能是解决方案。插入或更新)。如果经理试图将客户分配给已经有 4 个客户的员工,我们不应该允许将该记录插入到将客户与其员工链接的表中。在这种情况下,我们需要一个在插入之前起作用的触发器。如果该员工不在列出有 4 个客户的员工的子查询中,我们只希望插入发生。
我们想停止插入,但根据法律,触发器不会基于仅在触发器中声明的条件执行此操作。据我了解,这样做的唯一方法是发送信号(查看使用触发器停止插入或更新
这引出了我接下来的两个问题。
使用信号“理想”吗?有问题吗?有没有更好的方法根据条件插入表,而不是仅仅在插入之前或插入之后执行副作用?
如果一开始就违反了约束,数据库似乎会发送一个信号,那么这会影响在它之上构建的应用程序吗?
解决方案
一些克制的味道可以这样处理:
INSERT INTO TABLE (a,b,c)
SELECT ...
WHERE <-- put the logic here (if possible)
也就是说,SELECT
根据您的业务逻辑安排交付更多或更少的行。
推荐阅读
- apache - Drupal - 安装模块 - 管理员拒绝访问
- spring-boot - 我在单独的服务文件中与 axios 混淆了
- android - 无法解决错误属性 Alpha not found
- java - 子数组列表输出在 n 个元素后重复
- php - Codeigniter 自定义表单验证规则
- sql - 如何在 Postgresql 中使用自定义数组获取列值?
- react-native - React native flatlist 为不符合条件的项目留下空白
- r - 在 R 中使用 ggplot() 进行自定义轴定位
- c - 用户输入和写入的区别(0, input, strlen(input))
- windows - Windows 上 Ubuntu 的 Firefox X11 无法正常工作