【问题标题】:How to insert values into a junction/linking table in SQL Server?如何将值插入到 SQL Server 中的联结/链接表中?
【发布时间】:2019-02-16 05:13:55
【问题描述】:

关于创建联结/链接表,我对this question 持反对态度。很清楚如何创建联结表,但我关心如何用数据填充联结表。用其他两个表(电影,作家)之间的数据填充联结表(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)
);

最终的联结表当前为空。这是一个简单的例子,你可以手动将数据填充到联结表中,但是如果我有两个数百万行的表,这样的事情是如何完成的呢?

【问题讨论】:

  • 从您提供的数据来看是不可能的。
  • 您将insert 与要插入的行的键一起使用。
  • 大概,您有​​某种类型的来源,可以告诉您哪个作家写了哪​​部电影(继续您的示例)-您将根据它编写插入脚本。

标签: sql sql-server database-design relational-database


【解决方案1】:

您好,我猜这与您不能依赖不同地区的身份列相同的事实有关。

您可以将插入编写为来自 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 很容易为所有现有的联结组合生成 SQL 语句

另一种方法是使用 SET IDENTITY_INSERT ON - 但这需要在加载其他 2 个表时完成,并且该船可能已经航行!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 2016-11-03
    • 2012-12-29
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多