Как вставить значения в таблицу соединений / ссылок в SQL Server? - PullRequest
0 голосов
/ 11 сентября 2018

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

CREATE TABLE movie
(
     movie_id INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
     movie_name NVARCHAR(100),
     title_date DATE
);

CREATE TABLE writer
(
     writer_id INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
     writer_name NVARCHAR(100),
     birth_date DATE
);

INSERT INTO movie 
VALUES ('Batman', '2015-12-12'), ('Robin', '2016-12-12'),
       ('Charzard, the movie', '2018-12-12')

INSERT INTO writer 
VALUES ('Christopher', '1978-12-12'), ('Craig', '1989-12-12'),
       ('Ash', '1934-12-12')  

CREATE TABLE movie_writer_junction
( 
     movie_id  INT,
     writer_id INT,

     CONSTRAINT movie_writer_pk 
         PRIMARY KEY(movie_id, writer_id),
     CONSTRAINT movie_id_fk 
         FOREIGN KEY(movie_id) REFERENCES movie(movie_id),
     CONSTRAINT writer_fk 
         FOREIGN KEY(writer_id) REFERENCES writer(writer_id)
);

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

1 Ответ

0 голосов
/ 12 сентября 2018

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

Вы можете написать свои вставки в виде перекрестного соединения из 2 таблиц SRC

Insert junc_table (writer_id, movie_id)
Select writer_id , movie_id
from writer 
CROSS Join 
movie
where writer_name = 'Tolkien' and movie_name = 'Lord of the Ring'

Таким образом, вы всегда получаете правильный суррогатный ключ (идентификатор) из обеих таблиц. Довольно просто сгенерировать оператор SQL для всех существующих комбинаций соединений, используя немного Dynamic SQL

Другой подход заключается в использовании SET IDENTITY_INSERT ON - но это необходимо сделать при загрузке двух других таблиц, и этот корабль, возможно, уже отплыл!

...