gpt4 book ai didi

mysql - SQL:在插入到另一个表时有条件地从表中插入/选择

转载 作者:行者123 更新时间:2023-11-29 08:13:56 26 4
gpt4 key购买 nike

我正在尝试将日志事件插入到 mySQL 中的表中(但我对数据库工作相对较新)。我有两个表,一个是用户名和用户 ID 的表,如下所示:

CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

我有一个日志消息表,如下所示:

CREATE TABLE IF NOT EXISTS `messages` (
`messageid` int(11) NOT NULL AUTO_INCREMENT,
`userid` int(11) NOT NULL,
`timestamp` datetime NOT NULL,
`message` text NOT NULL,
PRIMARY KEY (`messageid`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

我的问题是,当数据到来时,我需要记录到“消息”,我有三条信息:时间戳、消息和用户名(不是用户 ID),并且该用户名可能不在“用户”表中(但我需要添加它)。为了解决这个问题我一直在做:

  1. 从“用户”中选择以获取与用户名关联的 ID。
  2. 如果选择返回 0 行,则将用户名插入到“users”表中。
  3. 现在将带有 ID、消息和时间戳的消息插入到“messages”表中。

这需要对每条消息执行 2-3 个 SQL 查询(这可能是相当大量的数据)。

执行 #1-3 的最有效方法是什么?

最佳答案

您应该能够执行以下操作,因为您对 name 有 UNIQUE 约束:

INSERT INTO users (name) VALUES ('username')
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id)

该查询将将该用户名的 ID 填充到 mysql 中的 LAST_INSERT_ID 槽中。然后您可以使用该 ID 插入消息表中。

这是一个示例,说明您是否可以向 mysql 发送多个查询:

INSERT INTO users (name) VALUES ('username')
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id);

INSERT INTO messages (userid, timestamp, message)
SELECT LAST_INSERT_ID(), 'timestamp', 'message';

例如,如果您在 php 中使用 mysqli,则可以通过 mysqli_multi_query 发送此信息.

如果您无法一次发送多个查询,则根据您访问数据库的方式,SELECT LAST_INSERT_ID() 可能不适合您。在这种情况下,您应该手动检索last_insert_id并创建第二个插入查询,如下所示:

INSERT INTO messages (userid, timestamp, message) 
VALUES ('id', 'timestamp', 'message');

关于mysql - SQL:在插入到另一个表时有条件地从表中插入/选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20984270/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com