【问题标题】:How to insert values into bridge table (made of 2 Foreign Key rows) on T-SQL如何在 T-SQL 上将值插入桥接表(由 2 个外键行组成)
【发布时间】:2017-11-23 09:10:36
【问题描述】:

我是 T-SQL 的新手,我在这方面很糟糕(只是学习它,因为它是我学校的必修课)。我搜索了很多,但找不到我的问题的答案。

我有一个名为 book_author 的桥表,有 2 行:Book_ISBN(这是 Books 表中的外键)和 Author_ID(作者表中的外键)。这是我用来创建它的代码:

CREATE TABLE Book_Author (
    Book_ISBN BIGINT,
    Author_ID BIGINT,
    CONSTRAINT Pk_Book_Author PRIMARY KEY (Book_ISBN, Author_ID),
    CONSTRAINT FK_B_A_Book_ISBN FOREIGN KEY (Book_ISBN) REFERENCES Book(Book_ISBN),
CONSTRAINT FK_B_A_Author_ID FOREIGN KEY (Author_ID) REFERENCES Author(Author_ID)
)

所以我只想将这些表中的值插入到桥表 (book_author) 中。到目前为止,这对我有用(但影响了 0 行,因此没有添加任何数据):

INSERT INTO Book_Author (Book_ISBN, Author_ID)
SELECT book.Book_ISBN, author.Author_ID
    FROM Book_Author
    INNER JOIN Book ON Book_Author.Book_ISBN = Book.Book_ISBN 
    INNER JOIN Author on Book_Author.Author_ID = Author.Author_ID

由于提到的行(来自 books 表和 author 表)已经有数据,我认为 T-SQL 会自动将这些值插入 book_author 表(并且具有相同的列名)。这是我用来向 book 表中插入数据的代码:

    INSERT INTO Book (Book_ISBN, Book_Name, Publisher_ID, Edition, Language, Genre, Year_Published)
    VALUES  ('9780261103573', 'The Fellowship of the Ring', '1', '1', 'English', 'Fantasy Fiction', '1954'),
            ('9780007203550', 'The Two Towers', '1', '1', 'English', 'Fantasy fiction', '1960'),
            ('9780007129720', 'The Return of the King', '1','1', 'English', 'Fantasy fiction', '1965'),
            ('9780399900709', 'The Bourne Identity', '2', '3', 'English', 'Spy thrillers', '1980'),
            ('9788563560520', 'Quincas Borba', '3', '5', 'Portuguese', 'Romance', '1982'),
            ('9782864972662', 'Astérix chez les Pictes', '4', '3', 'French', 'Adventure comic books', '2012');

这是我用来向作者表中插入数据的代码:

    INSERT INTO Author (Author_ID, Author_FName, Author_LName)
    VALUES  (1, 'Tolkien', 'J.R.R.'),
            (2, 'Robert', 'Ludlum'),
            (3, 'Machado', 'de Assis'),
            (4, 'Jean-Yves', 'Ferri');

提前感谢您的帮助,我们将不胜感激。

【问题讨论】:

  • 请提供您要插入到 Book_Author 表中的示例数据
  • 由于book_author Link 表还没有任何值(如果我理解正确的话),那么您不可能在该表上使用 JOIN 来获取任何值......因此,鉴于您的书籍和作者列表-您如何知道哪些作者属于哪本书(因此您可以将这些值插入链接表)?!?这正是链接表的目的,所以如果您想在该表中创建值 - 您如何确定哪些作者属于哪些书籍??
  • 嗨@ITSGuru!我刚刚添加了更多信息。谢谢!
  • 您从要插入的表中选择数据?你确定它有数据?并小心使用内部连接,因为它会删除所有未映射的内容。我们可以看看你的 Book_auto 表吗?
  • 不,这里没有什么“自动魔法” - 你有 n 本书和 m 个作者 - 如何他们属于一起吗?这正是链接表应该定义的内容 - 但您不能只是自动完成这项工作 - 必须定义哪个作者属于哪本书并插入将适当的行放入链接表中以建立这些连接!

标签: sql-server tsql foreign-keys sql-insert


【解决方案1】:

为什么要在简单的插入查询中使用连接?

INSERT INTO Book_Author (Book_ISBN, Author_ID) VALUES ('9780261103573','1')
INSERT INTO Book_Author (Book_ISBN, Author_ID) VALUES ('9780007203550','1')
INSERT INTO Book_Author (Book_ISBN, Author_ID) VALUES ('9780007129720','1')
INSERT INTO Book_Author (Book_ISBN, Author_ID) VALUES ('9780399900709','2')
INSERT INTO Book_Author (Book_ISBN, Author_ID) VALUES  ('9780399900709','2')
INSERT INTO Book_Author (Book_ISBN, Author_ID) VALUES ('9782864972662','4')

【讨论】:

  • 嗨,我们如何在循环中动态地运行以上查询集?
【解决方案2】:

您的插入语句从 FROM 表上的 0 行中读取,然后是内部连接,因此结果将始终为 0 行。即使桥表有行,也会因为主键违规而被选中但无法插入,因为您尝试插入已经存在的数据。

我假设您在某处有一些其他的专栏持有我想在书中的这种关系,比如 Book.Author_ID。在这种情况下,您需要:

INSERT INTO Book_Author (Book_ISBN, Author_ID)SELECT Book.Book_ISBN, Book.Author_ID FROM Book GROUP BY Book.Book_ISBN, Book.Author_ID

如果您还有其他信息,例如在 Author 表中创建一个类似的 SELECT,使用 GROUP BY 确保您获得不同的值,并为两个 select 语句使用 UNION 以确保您也从两个 SELECT 语句中获得不同的值。

这是为了填补现有的关系。对于新书,您必须使用如上所示的简单插入语句。

【讨论】:

    猜你喜欢
    • 2021-12-23
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 2019-05-10
    • 1970-01-01
    • 2017-01-27
    相关资源
    最近更新 更多