我有3个表,网络,节点,网络节点,网络连接。
networknodes有3个字段network_node_id,network_id和node_id,最后两个是对网络的forien密钥引用。和网络可能包含同一节点的多个副本(但使用不同的network_node_id)
networkconnections有fileds networkconnection_id,start_network_node_id,end_network_node_id
现在我要复制一个网络条目,这包括创建一个新的网络表记录,在网络节点和网络连接中创建记录的副本。
如何使用MySQL存储过程完成此操作?是否可以在单个查询中执行此操作而不使用数组和for循环?
DROP PROCEDURE IF EXISTS `DuplicateNetwork`;
CREATE PROCEDURE `DuplicateNetwork`(network_key char(50))
BEGIN
DECLARE newNetworkId BINARY(16);
// Generate a Unique using function
SELECT NewKey() INTO newNetworkId;
// Create a new Network
INSERT INTO networks (network_id,
Label,
AppBackgroundColorKey,
DateAdded,LastModified)
SELECT newNetworkId,
Label,AppBackgroundColorKey,
DateAdded,
NOW(),
FROM networks
WHERE network_id = network_key;
// Copy networknodes reords curresponding to network_key
// Store the ids of newly created recored to an array or some other structure called NN
INSERT INTO networknodes (
network_node_id,
network_id,
node_id,
DateAdded,
LastModified)
SELECT NewKey(), // Need to dtore this value in NN
newNetworkId,
node_id,
DateAdded,
NOW()
FROM networknodes
WHERE network_id = network_key;
// Copy networkconnections reords curresponding to network_key
// This part is incorrect, i don't know how two make it, help is needed here
INSERT INTO networkconnections(networkconnection_id,
start_network_node_id,
end_network_node_id,
DateAdded)
SELECT NewKey(),
(SELECT NWN_start.network_node_id ...),
(SELECT NWN_end.network_node_id ...),
FROM networkconnection
INNER JOIN networknodes AS NWN_start ON networkconnection.start_network_node_id=NWN_start.network_node_id
INNER JOIN networknodes AS NWN_end ON networkconnection.end_network_node_id =NWN_end.network_node_id
//WHERE NWN_start.networl_id = network_key;
// For each room network connection
replace the old networknode_id with new networknode_id for both start and end nodes
END;
很棒任何人都可以改进/完成算法
答案 0 :(得分:1)
是的,创建一个临时表来保存您正在复制的值,然后您可以保留对旧值的引用。保留第一个查询,然后执行:
CREATE TEMPORARY TABLE tmpNetworkNodes( ......这里的架构...... )
INSERT INTO tmpNetworkNodes
SELECT NewKey() as newNetworkKey, // Need to dtore this value in NN
newNetworkId,
newNodeId() as newNodeId
node_id as oldNodeId,
DateAdded
FROM Networknodes
WHERE network_id = network_key;
INSERT INTO networknodes (
network_node_id,
network_id,
node_id,
DateAdded,
LastModified)
SELECT newNetworkKey, newNetworkId, newNodeId, DateAdded, Now()
from tmpNetworkNodes
INSERT INTO networkconnections(
networkconnection_id,
start_network_node_id,
end_network_node_id,
DateAdded)
SELECT NewKey(),
NWN_start.newNodeId,
NWN_end.newNodeId,
FROM networkconnection
INNER JOIN tmpNetworkNodes AS NWN_start
ON networkconnection.start_network_node_id=NWN_start.oldNodeId
INNER JOIN tmpNetworknodes AS NWN_end
ON networkconnection.end_network_node_id =NWN_end.oldNodeId
DROP TEMPORARY TABLE tmpNetworkNodes
因为临时表只包含您感兴趣的网络元素,所以上一个查询中的内部联接将过滤掉其他网络中的任何内容。
我假设你有一个newNodeId函数,就像你为networkKey()做的那样,所以没有列是identity / autoincrement。我可能也有你的架构错误,因为没有完整的表格规则很难理解关系。
希望它有所帮助!