如何在 MySQL 中使用交叉表?

How to work with cross tables in MySQL?

我开始使用 MySQL 几天了,我正在用它为我的书籍创建一个数据库。现在,由于作者和书籍之间存在 "many to many" 关系,因此我添加了关联 table 来修复这种关系。

第 1 Table:书
book_id 作为主键

第二 Table:作者
author_id 作为 pk。

第三 Table: 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);

?

我是不是漏掉了什么?

在没有更多信息的情况下很难理解您要实现的目标的上下文,但是类似于下面的查询的内容将根据给定的条件插入(看起来好像我们正在插入查找 table)...

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 中填充它(同样,因为我们正在填充lookup table),这意味着你有一个对象,你可以传递它的参数来否定子查询的必要性。所以它会是这样的:

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

还有触发器的概念...

你想要一个 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'