Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm cách nào để sao chép sâu một tập dữ liệu và thay đổi các tham chiếu FK để trỏ đến tất cả các bản sao?

Đây là một ví dụ với ba bảng có thể giúp bạn bắt đầu.

Lược đồ 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 để sao chép người dùng với các bản ghi sự kiện và chương trình làm việc của anh ta

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 ;

Để sao chép người dùng

CALL clone_user(3);

Đây là SQLFiddle bản trình diễn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách xoay động với cột ngày tháng

  2. Cách nhận giá trị cột nhận dạng mà không đề cập đến tên cột nhận dạng trong Chọn - Hướng dẫn SQL Server / T-SQL Phần 46

  3. Tạo Ngày giữa các phạm vi ngày

  4. Nhóm SQL BY, N mục hàng đầu cho mỗi Nhóm

  5. Sử dụng NEWSEQUENTIALID () để tạo HƯỚNG DẪN Tăng dần trong SQL Server