如何在 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'
我开始使用 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'