首页 > 解决方案 > 如何调用函数并在 SELECT 查询中复制返回值?

问题描述

我已经定义了一个CREATE_UUID()生成 UUID 的函数。我想 INSERT INTO...SELECT 复制一个表,但有两个具有相同值的新列。

INSERT INTO Table (id, uuid1, uuid2)
SELECT ROWID, CREATE_UUID(), CREATE_UUID()
FROM AnotherTable

但是这样做会以不同的值调用该函数两次。我应该如何修改此查询,以便同一行中的两列不会有不同的值,但会为每一行生成一个新的 UUID?

标签: mysqlsql

解决方案


变体 1。

INSERT INTO `Table` (id, uuid1, uuid2)
SELECT ROWID, generate_uuid.new_uuid, generate_uuid.new_uuid
FROM AnotherTable
CROSS JOIN ( SELECT CREATE_UUID() new_uuid ) generate_uuid

但是,如果您插入大量行,则服务器可能会“优化”执行,并且所有行都可能获得相同的 UUID

变体 2。

INSERT INTO `Table` (id, uuid1, uuid2)
SELECT ROWID, new_uuid, new_uuid
FROM ( SELECT ROWID, CREATE_UUID() new_uuid 
       FROM AnotherTable ) source_data;

在这种情况下,服务器可能会向后为每个插入的 value调用 new generation 。

变体 3。

INSERT INTO `Table` (id, uuid1, uuid2)
SELECT ROWID, @new_uuid := CREATE_UUID(), @new_uuid
FROM AnotherTable;

似乎是最安全的。但是不推荐使用用户定义的变量赋值。

这一切应有尽有


推荐阅读