MYSQL:如何在 SELECT 中执行 INSERT?

标签 mysql sql

我正在尝试在选择内执行插入操作。这是为了将多个相互依赖的插入链接在一起。因此它看起来像这样。

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;

最佳答案

不,您不能在 SELECT“内部”执行 INSERT,也不能在另一个 INSERT 内部执行 INSERT。

您可以尝试使用触发器,但恕我直言,这比它的值(value)更麻烦。

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

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);

这些 session 变量的范围仅限于 session ,因此您不必担心并发客户端执行自己的工作会覆盖您的工作,即使每个 session 都使用相同的变量名称。

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

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

关于MYSQL:如何在 SELECT 中执行 INSERT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24275287/

相关文章:

mysql - 时间戳列的字段列表中的未知列

mysql - 使用 SELECT 子查询的结果更新列

MySQL多Master复制拓扑

mysql - 在使用 cfif 的查询中尝试将行值与表单值进行比较并执行查询

sql - Rails,洗劫 : How to search HABTM relationship for "all" matches instead of "any"

sql - 在 PostgreSQL 中创建高效查询并合并语句

java - 电影数据库查询

c++ - CMake 无法找到 mysqlclient 库

php - MySQL数据库插入错误

sql - 数据丢失的Sqoop导出