MySQL存储过程来自4个相互关联的表的重复记录

时间:2010-08-04 13:09:49

标签: sql mysql stored-procedures function

我有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;

很棒任何人都可以改进/完成算法

1 个答案:

答案 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。我可能也有你的架构错误,因为没有完整的表格规则很难理解关系。

希望它有所帮助!