0

我试图找出处理两个表之间关系的最佳方法。第一个表存储新消息和发布者的 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 列依赖于消息表中的同一列,将信息插入收件人表的最佳方法是什么?Messageid 是在发布消息时创建的,所以我会在消息表中查询 messageid,将其转换为变量并使用该变量插入到收件人表中吗?或者有没有更实用的方法?

4

1 回答 1

1

如果您`message.messageId使用自动增量列创建列值,则可以使用 MySQLLAST_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;

和允许在一个 SQL 语句中插入一堆用户 ID,它们都具有相同的值UNION ALLfrom 。JOINLAST_INSERT_ID()

于 2013-09-11T19:16:58.623 回答