我正在试图找出处理两个表之间关系的最佳方法。第一个表存储新消息和发布消息的人的UID;
+-----------+--------+-------------------+-----------+
| 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 |
+-----------+--------+
我的问题是,因为收件人表中的messageid列依赖于messages表中的同一列,将信息插入收件人表的最佳方法是什么? Messageid是在发布消息时创建的,所以我会在消息表中查询messageid,将其转换为变量并使用该变量插入到recipients表中吗?还是有更实用的方法?
答案 0 :(得分:1)
如果您使用自动增量列创建`message.messageId
列值,则可以使用MySQL LAST_INSERT_ID()
函数在后续语句中检索其值。
所以你可以这样做:
INSERT INTO message (userid, subject, message) VALUES (70, 'Subject', 'Message');
SELECT LAST_INSERT_ID();
在程序中检索该值。然后做一系列的
INSERT INTO recipient (messageid, userid) VALUES (value, userid);
如果出于某种原因,您需要在客户端程序中检索并使用LAST_INSERT_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语句中插入一堆userid,所有这些都来自LAST_INSERT_ID()
的相同值。