Mysql 消息和相应响应的处理表
我正试图找出处理两个表之间关系的最佳方法。第一个表存储新消息和发布者的UIDMysql 消息和相应响应的处理表,mysql,Mysql,我正试图找出处理两个表之间关系的最佳方法。第一个表存储新消息和发布者的UID +-----------+--------+-------------------+-----------+ | messageid | userid | subject | message | +-----------+--------+-------------------+-----------+ | 1 | 70 | Subject | Mes
+-----------+--------+-------------------+-----------+
| messageid | userid | subject | message |
+-----------+--------+-------------------+-----------+
| 1 | 70 | Subject | Message |
| 4 | 70 | Subject | Message |
| 5 | 63 | Subject | Message |
| 6 | 67 | Test | Test |
| 7 | 67 | Another test, yo' | Test, yo' |
+-----------+--------+-------------------+-----------+
第二个表包含有权访问相应邮件的收件人列表
+-----------+--------+
| messageid | userid |
+-----------+--------+
| 1 | 63 |
| 1 | 68 |
| 1 | 69 |
+-----------+--------+
我的问题是,因为recipients表中的messageid列依赖于messages表中的同一列,所以将信息插入recipients表的最佳方式是什么?Messageid是在邮件发布时创建的,因此我是否要在messages表中查询Messageid,将其转换为变量并使用该变量插入到recipients表中?或者有更实用的方法吗?如果使用自动增量列创建
`message.messageId
列值,则可以使用MySQLLAST\u INSERT\u ID()
函数在后续语句中检索其值
所以你可以这样做:
INSERT INTO message (userid, subject, message) VALUES (70, 'Subject', 'Message');
SELECT LAST_INSERT_ID();
在程序中检索该值。然后做一系列的测试
INSERT INTO recipient (messageid, userid) VALUES (value, userid);
如果出于某种原因,您需要执行此操作,而无需在客户端程序中检索并使用LAST\u INSERT\u ID()
,则可以执行此SQL语句序列
INSERT INTO message (userid, subject, message) VALUES (?, ?, ?);
INSERT INTO recipient (messageid, userid)
SELECT a.messageid, b.userid
FROM (
SELECT LAST_INSERT_ID() AS messageid
) AS a
JOIN (
SELECT ? AS userid
UNION ALL
SELECT ? AS userid
UNION ALL
SELECT ? AS userid
) AS b;
UNION ALL
和JOIN
允许在一条SQL语句中插入一组用户ID,所有这些用户ID都具有来自LAST\u INSERT\u ID()
的相同值。那么,如果表同时发生多个写操作,mysql如何知道我正试图从相应的事务中获取messageID?如果三个人同时进行插入,这不会导致问题吗?LAST\u INSERT\u ID()
返回当前连接上生成的最新自动增量值。因此,在多个客户端或多个线程使用自己的连接更新数据库的情况下,它是完全健壮的。不太可能有多个线程使用单个连接,因为大多数客户端库连接对象甚至都不是线程安全的。有趣。哇,听起来非常有用。我很高兴我问了。谢谢你,奥利。与插入到消息中的连接相同,但语句不同。它们似乎都使用相同的$db_conn值,因此它们都是相同的连接。