MySQL хранимая процедура для дублирования записей из 4 взаимосвязанных таблиц - PullRequest
3 голосов
/ 04 августа 2010

У меня есть 3 таблицы, сети, узлы, сетевые узлы, сетевые соединения.

Сетевые узлы имеют 3 поля network_node_id, network_id и node_id, последние два являются ссылками на другие ключи сети.и сеть может включать несколько копий одного и того же узла (но с другим идентификатором 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 Ответ

1 голос
/ 25 августа 2010

Да, создайте временную таблицу для хранения копируемых вами значений, после чего вы сможете сохранить ссылку на старые значения.Сохраните первый запрос, затем выполните:

СОЗДАТЬ ВРЕМЕННУЮ ТАБЛИЦУ 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 

УДАЛИТЬ ВРЕМЕННУЮ ТАБЛИЦУ tmpNetworkNodes

Посколькувременная таблица содержит только элементы для интересующей вас сети, внутренние объединения в последнем запросе отфильтруют что-либо из других сетей.

Я предполагаю, что у вас есть функция для newNodeId, как и для networkKey (), поэтому ни один из столбцов не является идентификатором / автоинкрементом.Я также могу ошибаться в вашей схеме, так как трудно понять, что это за отношения без полной спецификации таблицы.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...