首页 > 解决方案 > 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:事务提交后调用触发器

好几天后,我仍然没有接近解决方案,但怀疑我是第一个遇到此类问题的人。任何关于如何在不合并两个表的情况下解决这种情况的建议将不胜感激。

标签: 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)

所以它满足你的要求


推荐阅读