我开始使用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);
我错过了什么吗?
答案 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'