mysql - MySql:强制创建子表条目
问题描述
在我的数据库结构中,我遇到了以下问题。
cable table
----------------------------
| id | description | type_id |
----------------------------
cableEnd table
------------------------
| cabel_id | address_id |
------------------------
父表cable包含一般信息,子表cableEnd包含位置特定信息。要使电缆有效,它必须至少有两端。我的问题是我希望确保创建这些,因为可能有人创建了电缆入口但忘记创建导致无效/未完成的数据。
我可以通过插入电缆入口时的触发器自动创建这两个入口。然而,由于不会提供地址信息,这些条目将与没有条目一样无用。
在我的脚本中,我可以很容易地确保两个表都通过事务填充,例如。
START TRANSACTION
INSERT INTO cable(description, type_id) VALUES('Lorem ipsum', 1);
SET @id = LAST_INSERT_ID();
INSERT INTO cableEnd(@id, '123');
INSERT INTO cableEnd(@id, '345');
COMMIT;
同时向父子表插入数据。该主题是许多相关问题之一。
但是我不能确定没有通过 phpMyadmin 或其他方式手动插入值。在最坏的情况下,我可以定期查询数据库以查找任何没有末端的电缆入口,但这似乎不是一个理想的解决方案。我曾希望我能以某种方式同时插入两个表,允许 AFTER_INSERT 触发器确认有效性。或者在事务和手动插入之后以某种方式调用相同的触发器。这似乎是不可能的。MySQL:事务提交后调用触发器
好几天后,我仍然没有接近解决方案,但怀疑我是第一个遇到此类问题的人。任何关于如何在不合并两个表的情况下解决这种情况的建议将不胜感激。
解决方案
您可以使用存储过程代替带参数的触发器:
CREATE PROCEDURE CreateCable(_description varchar(50), _type_id int, _address1 int, _address2 int)
BEGIN
DECLARE InsertID INT;
START TRANSACTION
INSERT INTO cable(description, type_id) VALUES(_description, _type_id);
SELECT LAST_INSERT_ID() INTO InsertID;
INSERT INTO cableEnd(cabel_id, address_id) VALUES (InsertID, _address1);
INSERT INTO cableEnd(cabel_id, address_id) VALUES (InsertID, _address2);
COMMIT;
END
并使用调用存储过程
CALL CreateCable('Lorem Ipsum', 1, 123, 345)
所以它满足你的要求
推荐阅读
- python - 用if函数改变点颜色的散点图问题
- javascript - 在父组件内有条件地渲染子组件
- reporting-services - SSRS 2017 - 数据源选项已从门户网站中消失
- angular - 文本在 mat-icon-button 上重叠
- flutter - 在颤动中从其父级更改嵌套的子级字段?
- python - 即使每 3 分钟(180 秒)进行一次服务器调用(ajax 调用)以使服务器响应并保持 http 连接处于活动状态,http 也会超时
- javascript - Node.js 中的事件驱动非阻塞 IO 模型是什么?
- chronicle - 追加回调时如何正确关闭编年史资源?
- netsuite - RANK 或 ROW_NUMBER 能否用于汇总的 Netsuite 搜索结果?
- rest - 如何在发布定义管道中创建/更新环境?