在单个查询中将 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查询中
如何在 Laravel 中将数据从 1 个视图插入到 2 个表中