MySql:强制创建子表项

时间:2019-01-25 11:35:43

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

insert data to parent and child table at the same time。与此主题相关的众多问题中有许多是一个。

但是,我不能确定地知道还没有通过phpMyadmin或其他方式手动插入值。 最坏的情况是,我可以定期查询数据库以查找没有端头的电缆条目,但这似乎不是理想的解决方案。 我希望我可以以某种方式同时插入两个表中,以允许AFTER_INSERT触发器来确认有效性。或以某种方式在交易和手动插入后调用相同的触发器。这似乎是不可能的。 MySQL: Invoke trigger after transaction is committed

几天后,我仍然无法找到解决方案,但是我怀疑自己是第一个遇到这种问题的人。 我将如何解决这种情况而不合并两个表的任何建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以使用存储过程作为替代,而不使用带有参数的触发器:

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)

因此它可以满足您的要求