繁体   English   中英

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

[英]SQL: Conditionally inserting/selecting from a table while inserting into another

我正在尝试将日志事件插入到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. 从USERS中选择以获取与用户名关联的ID。
  2. 如果select返回0行,则将用户名插入“users”表。
  3. 现在将消息插入带有id,message和timestamp的“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'); 

使用insert ignore和条件选择分两步实现。

INSERT IGNORE INTO用户(名称)VALUES(“raj”);

在插入消息表时,有条件地使用最后一个插入ID或现有用户ID。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM