在单个查询中将 SQL 关系插入到 2 个表,而不使用 mysql_insert_id()

Posted

技术标签:

【中文标题】在单个查询中将 SQL 关系插入到 2 个表,而不使用 mysql_insert_id()【英文标题】:SQL relational insert to 2 tables in single query without resorting to mysql_insert_id() 【发布时间】:2012-07-19 02:25:47 【问题描述】:

我对 SQL 并不完全陌生,但对 mysql(使用 phpMyAdmin)感到生疏和挣扎……看了这个:MySQL insert to multiple tables (relational) 和其他一些相关主题,但还没有找到答案。我正在简化我的示例以说明问题。

如果你有两个表:

'table1' has: id (primary key, auto-increment), description (text)
'table2' has: id (primary key, auto-increment), title (text), description_id (int)

如何创建一个单独的 INSERT 语句,以便 description_id 存储 table1.id 的值?

我知道有 php 方法可以做 2 个查询,但我想用 SQL 做这一切,一定有办法吗?我应该以不同的方式设置我的桌子吗? I read something about foreign keys 不知道这是否适用。

谢谢!

【问题讨论】:

INSERT 语句只能影响一张表。 ***.com/questions/5178697/… 我在 mysql 文档中遇到了一些有希望的东西:INSERT INTO foo (auto,text) VALUES(NULL,'text'); # generate ID by inserting NULL INSERT INTO foo2 (id,text) VALUES(LAST_INSERT_ID(),'text'); # use ID in second table 【参考方案1】:

您不能使用插入语句插入多个表(除了可写视图*,但 AFAIK MySQL 不支持它们)。

可能感兴趣的是transactions,它允许您将语句“分组”到一个“atomic”操作中。

* 实际上,它只允许更新,而不是插入(我相信,但现在我开始怀疑它......无论如何,这不是这里的问题)

【讨论】:

【参考方案2】:

您可能需要在此处使用触发器,这样每当 table2 获得插入操作时,就会执行触发器以在 table1 上执行插入操作。

【讨论】:

您将如何将第二个表的字段值提供给此触发器?【参考方案3】:

感谢@hackattack,谁找到了这个? answered already elsewhere.

BEGIN
INSERT INTO users (username, password) 
  VALUES('test', 'test')
INSERT INTO profiles (userid, bio, homepage) 
  VALUES(LAST_INSERT_ID(),'Hello world!', 'http://www.***.com');
COMMIT;

但是,唉 - 没用。 MySQL 5 参考显示它的语法略有不同:

INSERT INTO `table2` (`description`) 
  VALUES('sdfsdf');# 1 row affected.
INSERT INTO `table1`(`table1_id`,`title`) 
  VALUES(LAST_INSERT_ID(),'hello world');

而且,瞧/瞧——这行得通!

还有更多的麻烦 尽管查询将在 phpMyAdmin 中成功,但我的 PHP 安装抱怨查询并引发语法错误。我采用 php 方式执行此操作并进行 2 个单独的查询并使用 mysql_insert_id()

我觉得这很烦人,但我想这并不比事务少多少服务器负载。

【讨论】:

究竟是什么I proposed(感谢您投票或接受答案...)。不过严格来说,这仍然是 2 个查询。只是它们被作为一个单一的原子动作执行。 @roblll 啊哈,我从您的评论中学到了一些新东西 - 一个原子动作......归根结底,它与效率和服务器负载等有关......所以无论什么让它变得更紧密和更快,这就是我所追求的。 @RobIII 和我建议的 PHP 替代方案有何不同? @tim Transactions 实际上可能会减慢速度,您必须考虑为它们支付的“罚款”。话说回来;我会使用它们。 @Nerd-Herd My answer 曾经/现在:你不能。然后我建议使用事务使其至少(在应用程序级别)看起来是一个原子操作。您仍然可以提供所有值并执行“一个”插入。您的答案假定数据已经在一个或多个表中。实际上,我看不出我的回答(“你不能”)与yours 有何相似之处?

以上是关于在单个查询中将 SQL 关系插入到 2 个表,而不使用 mysql_insert_id()的主要内容,如果未能解决你的问题,请参考以下文章

如何从1个表中选择许多行并将其插入另一个表中特定行的特定JSONB字段中?但是在单个原始SQL查询中

SQL nolock 和 join

如何在 Laravel 中将数据从 1 个视图插入到 2 个表中

如何使用 3 个表在 SQL 查询中获得完整结果,其中 1 个表保持 2 个表的关系?

如何通过单个 sql 查询连接 3 个表?

SQL SERVER 数据库 怎么从一个服务器一个表中把数据插入到另一个服务器中的一个表内