Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да копирам дълбоко набор от данни и да променя FK препратките, за да сочат към всички копия?

Ето пример с три таблици, които вероятно могат да ви помогнат да започнете.

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);

Ето SQLPiddle демонстрация.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Пакет за настройка на Spotlight Basic:Най-добрият безплатен инструмент за оптимизиране на SQL

  2. Допълнете низ с водещи нули, така че да е дълъг 3 знака в SQL Server 2008

  3. Кой е най-добрият инструмент за сравняване на две бази данни на SQL Server (схема и данни)?

  4. Получавате всички имена на таблици на конкретна база данни чрез SQL заявка?

  5. 4 съвета за настройка на вашия SQL Server сигнали