如何在MySQL中使用交叉表?

时间:2015-06-03 13:09:30

标签: mysql sql relationship

我开始使用MySQL几天了,我正在使用它为我的图书创建数据库。现在,由于我在作者和书籍之间存在“多对多”的关系,我添加了一个关联表来修复关系。

第一张桌子:BOOK
book_id作为主键


第二张表:作者
author_id为pk。

第3表:BOOK_AUTHOR
pk(book_id,author_id)

查询工作正常,我的问题是我不喜欢我填写“book_author”的方式,我用过:

insert into book_author values(X,Y,NULL);

但是通过这种方式,我必须知道'X'对应于“Moby Dick”而'Y'对应于“Melville”。目前,我是通过手动询问特定查询来实现的。

有没有一种优雅的方式来做类似的事情:

insert into book_author values("Moby Dick".book_id, "Melville".author_id,NULL);

我错过了什么吗?

2 个答案:

答案 0 :(得分:0)

在没有更多信息的情况下,很难理解你想要实现的内容的上下文,但是下面的查询将基于给定的标准插入(看起来好像我们正在插入查找表中)。 ..

INSERT INTO `book_author` (`book_id`, `author_id`)
VALUES ((
         SELECT `book_id` 
         FROM `books` 
         WHERE `title` like 'moby dick';
         ),
         (
          SELECT `author_id`
          FROM `authors`
          WHERE `last_name` like 'Melville';
          )
         ); 

然而,我认为你会从应用程序中的某种代码而不是SQL中填充它(再次,因为我们正在填充查找表),这意味着你有一个对象,您可以传递它的参数,否定子查询的必要性。所以它就像是:

var bookObject = GetSomeBook();
var query = "INSERT INTO `book_author` (`book_id`, `author_id`)" + 
            "VALUES (" + bookObject.BookId + ", " + bookObject.AuthorId + ");";

还有触发器的概念......

答案 1 :(得分:0)

你想要一个INSERT SELECT,如下所示:

INSERT INTO book_author(book_id,author_id) 
SELECT 
    book.id, 
    author.id 
FROM 
    book 
JOIN 
    author 
WHERE 
    book.name = 'Mody Dick' 
    AND author.name = 'Melville'