MYSQL:如何在SELECT中执行INSERT?

时间:2014-06-18 00:25:18

标签: mysql sql

我正在尝试在select中执行插入操作。这用于将多个插入链接在一起,这些插入彼此依赖。因此它看起来像这样。

INSERT (Parent)
--SELECT (Return the Child's uuid created and assigned by TRIGGER)
---INSERT (Child)

数据库中的每条记录都在通过触发器插入时分配了一个uuid。我为每个捕获的实体提供了一个表格(例如人,地址,电话,电子邮件)。

解决方案1:我可以先插入一个依赖的实体,例如手机,选择它的uuid,然后将其包含在父实体中。在这种情况下,“人”。

解决方案2:我可以创建父实体,然后创建依赖项,然后在获取依赖项uuid后更新父项。

解决方案3:我想要做的是在创建父级的同时创建依赖项,并将其uuid返回到父级记录插入的父级。这依赖于操作顺序,以确保一切按照适当的顺序发生。

由于mysql数组支持的问题,我正在捏造父/子uuid_array表。因此,还涉及其他操作,但给出的示例要简单得多。

关于如何解决此问题的任何想法?有没有更好的方法来返回uuid?

INSERT INTO person (Name_First,Name_Middle,Name_Last,Phone_UUID_Array)
VALUES  (
    'John',
    'Diddly',
    'Doe',
    SELECT @last_uuid
        INSERT INTO phone (Phone_Number,Phone_Type)
        VALUES  (
            '1-555-555-5555',
            (SELECT UUID FROM VIEW_TYPE_CATEGORY WHERE Reference_Type='Personal cell' AND Category='phone')
        )
);

我为每个表创建的触发器示例

CREATE TRIGGER uuid_person BEFORE INSERT ON person FOR EACH ROW SET NEW.UUID = UUID();
CREATE TRIGGER last_uuid_person AFTER INSERT ON person FOR EACH ROW SET @last_uuid = NEW.UUID;

CREATE TRIGGER uuid_phone BEFORE INSERT ON phone FOR EACH ROW SET NEW.UUID = UUID();
CREATE TRIGGER last_uuid_phone AFTER INSERT ON phone FOR EACH ROW SET @last_uuid = NEW.UUID;

1 个答案:

答案 0 :(得分:1)

不,你不能在SELECT里面执行INSERT,也不能在另一个INSERT中执行INSERT。

你可以玩触发器,但恕我直言,这比它的价值更麻烦。

我建议不要使用触发器执行此操作,而是生成uuid并将其保存在会话变量中。然后,您可以根据需要在后续语句中使用它。

SELECT UUID() INTO @phone_uuid;

INSERT INTO phone (Uuid,Phone_Number,Phone_Type) VALUES (@phone_uuid, ...);

INSERT INTO person (Name_First,Name_Middle,Name_Last,Phone_UUID_Array)
VALUES ('John', 'Diddly', 'Doe', @phone_uuid);

这些会话变量的范围限定在会话中,因此您不必担心并发客户端会自行覆盖您的工作,即使每个会话使用相同的变量名称也是如此。

另外,我担心你的描述Phone_UUID_Array是一个以逗号分隔的UUID列表。您可能不会对该设计感到满意,for a number of other reasons

你的参考方向错误了。 Person不应该尝试引用其所有相关电话号码。走另一条路 - phone中的每一行都应该引用其父person。这样您就不需要以逗号分隔的列表,并且可以以更合理的顺序插入它们 - 首先是parent,然后是一个或多个phone行,每个行都引用相同的父级。插入parent后,您无需更新phone