在 sp 中多次插入

Posted

技术标签:

【中文标题】在 sp 中多次插入【英文标题】:multiple Insert in sp 【发布时间】:2016-07-22 07:58:06 【问题描述】:

我在 mysql 数据库中有这些表:

tBook (idBook,BookName)
tAuthor (idAuthor,AuthorName)
tBookAuthor (FK_Book,FK_Author)

我想在一个存储过程中插入一本新书。在相同的过程中,我想插入表 tBookAuthor。

INSERT INTO `tBook`
   (`idBook`, `BookName`)
VALUES
   (23, 'myBookName')

INSERT INTO `tBookAuthor`
   (`FK_Book`, `FK_Author`)
VALUES
   (LAST_INSERT_ID(), 526)

【问题讨论】:

您面临的具体问题是什么?您描述的 2 个插入语句应该在存储过程中工作。您可能不需要在 idBook 字段中插入任​​何值,因为这可能是一个自动递增字段。 Using Mysql to do multiple INSERT on linked tables的可能重复 两个插入都应该工作。你面临什么问题? 我面临的问题是 php myadmin 不允许我执行此查询:DELIMITER // START TRANSACTION; INSERT INTO tMedia` (Title, Description, ISBN, InsertedIntoBibliothek, CoverLink,@,FK_AuthorFK_MediaType)值(myDescriptionmyISBNmyInsertDatemyAuthormyMediaType)插入INTO tMediaAuthor (FK_Media, FK_Author) 值 (LAST_INSERT_ID(), myAuthor) 提交; //` 欢迎来到 Stack Overflow!我尽可能地编辑了你的问题。但是,添加代码和描述的解释,以便更多具有该主题知识的人看到它。请在您遇到的特定错误消息中进行编辑,以防有必要识别特定问题。祝你好运! 【参考方案1】:

问题是我试图修改一个已经存在的 storec 过程。 我是在 PHPmyAdmin 中完成的。

如果你想创建一个新的存储过程,你可以这样做:

DELIMITER //
CREATE PROCEDURE new_person(
  first CHAR(35), last CHAR(35), email CHAR(255), tool_id INT)
BEGIN
START TRANSACTION;
INSERT INTO `tBook`
(`idBook`,
`BookName`)
VALUES
(23
'myBookName')

INSERT INTO `tBookAuthor`
(`FK_Book`,
`FK_Author`)
VALUES
(LAST_INSERT_ID(),
526)
COMMIT;
END//
DELIMITER;

如果你想在 phpmyadmin 中改变一个存储过程,你可以这样做:

BEGIN
START TRANSACTION;
INSERT INTO `tBook`
(`idBook`,
`BookName`)
VALUES
(23
'myBookName')

INSERT INTO `tBookAuthor`
(`FK_Book`,
`FK_Author`)
VALUES
(LAST_INSERT_ID(),
526)
COMMIT;
END

【讨论】:

【参考方案2】:

不要使用存储过程,因为您使用的是 PHP,我建议进行 2 次插入,因为第二次插入是外键,您必须选择作者,获取书籍的最后插入 ID 并进行简单的插入那里。 麻烦少了很多。

我也很难理解你的 dB 结构,一本书可以由多个作者写吗?如果是这样,我的错,否则,省去助手表的麻烦,只需将作者 ID 放在书上。

【讨论】:

哦,神秘的选民,你能告诉我你不喜欢我的回答吗?我根据先前的知识和经验发布了这个答案,所以我想知道为什么这不是一个好主意。 是的,一本书可以由多个作者撰写。没错。 那么为什么不能/不想在 php 中进行 2 次插入呢?

以上是关于在 sp 中多次插入的主要内容,如果未能解决你的问题,请参考以下文章

多次循环问题

在codeigniter中多次进入mysql时获取最后插入的'Id'

sql在具有回滚的事务中多次插入

多次生成一个插入对象

仅在循环中多次插入最后一个值

在MySQL多次插入中将数组值加入字符串