Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 消息和相应响应的处理表_Mysql - Fatal编程技术网

Mysql 消息和相应响应的处理表

Mysql 消息和相应响应的处理表,mysql,Mysql,我正试图找出处理两个表之间关系的最佳方法。第一个表存储新消息和发布者的UID +-----------+--------+-------------------+-----------+ | messageid | userid | subject | message | +-----------+--------+-------------------+-----------+ | 1 | 70 | Subject | Mes

我正试图找出处理两个表之间关系的最佳方法。第一个表存储新消息和发布者的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 |
+-----------+--------+

我的问题是,因为recipients表中的messageid列依赖于messages表中的同一列,所以将信息插入recipients表的最佳方式是什么?Messageid是在邮件发布时创建的,因此我是否要在messages表中查询Messageid,将其转换为变量并使用该变量插入到recipients表中?或者有更实用的方法吗?

如果使用自动增量列创建
`message.messageId
列值,则可以使用MySQL
LAST\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值,因此它们都是相同的连接。