sql >> データベース >  >> RDS >> Sqlserver

データセットをディープコピーし、すべてのコピーを指すようにFK参照を変更するにはどうすればよいですか?

    これはおそらくあなたが始めることができる3つのテーブルの例です。

    DBスキーマ

    CREATE TABLE users
        (user_id int auto_increment PRIMARY KEY, 
         user_name varchar(32));
    CREATE TABLE agenda
        (agenda_id int auto_increment PRIMARY KEY, 
         `user_id` int, `agenda_name` varchar(7));
    CREATE TABLE events
        (event_id int auto_increment PRIMARY KEY, 
         `agenda_id` int, 
         `event_name` varchar(8));
    

    アジェンダとイベントレコードを使用してユーザーのクローンを作成するSP

    DELIMITER $$
    CREATE PROCEDURE clone_user(IN uid INT)
    BEGIN
        DECLARE last_user_id INT DEFAULT 0;
    
        INSERT INTO users (user_name)
        SELECT user_name
          FROM users
         WHERE user_id = uid;
    
        SET last_user_id = LAST_INSERT_ID();
    
        INSERT INTO agenda (user_id, agenda_name)
        SELECT last_user_id, agenda_name
          FROM agenda
         WHERE user_id = uid;
    
        INSERT INTO events (agenda_id, event_name)
        SELECT a3.agenda_id_new, e.event_name
          FROM events e JOIN
        (SELECT a1.agenda_id agenda_id_old, 
               a2.agenda_id agenda_id_new
          FROM
        (SELECT agenda_id, @n := @n + 1 n 
           FROM agenda, (SELECT @n := 0) n 
          WHERE user_id = uid 
          ORDER BY agenda_id) a1 JOIN
        (SELECT agenda_id, @m := @m + 1 m 
           FROM agenda, (SELECT @m := 0) m 
          WHERE user_id = last_user_id 
          ORDER BY agenda_id) a2 ON a1.n = a2.m) a3 
             ON e.agenda_id = a3.agenda_id_old;
    END$$
    DELIMITER ;
    

    ユーザーのクローンを作成するには

    CALL clone_user(3);
    

    これがSQLFiddleです デモ。



    1. マクロとは何ですか?どのように使用しますか?

    2. 単純な集約からスライディング集約へのSQLでのデータ集約の技術

    3. Postgres:コンポジットキーを実行する方法は?

    4. MSSQLServerでのデータベースメール通知の構成