如何在phpMyAdmin -sql中使用两个表的主键的唯一值?(在 PHP 中使用)


how to use unique value for primary key of two table in phpMyAdmin -sql ? (use in php)

>我有 2 个这样的表:

1-private_messages表:

messageId  | message
--------------------
1          |  text1
4          |  text4

2-public_messages表:

messageId  |  message 
----------------------
2          |  text2
3          |  text3
5          |  text5

在两个表中,messageId 列是主键

现在我希望这两列是自动递增的,并且在两个表中具有唯一的 Id,如上所示。

现在,当我想在其中一个表中插入一行时,我必须找到每个表的最大 Id 并比较它们以找到其中的最大值。 然后增加它并插入新行。

我想知道,有没有更好或自动的方法,当我插入新行时,数据库会自动执行此操作?

谢谢

您可以使用如下所示的编程模式在MySQL中获取唯一编号。

首先为序列创建一个表。它有一个自动增量字段,没有别的。

CREATE TABLE sequence (
    sequence_id INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (`sequence_id`)
)

然后,当您需要在其中一个表中插入唯一编号时,请使用类似以下查询的内容:

INSERT INTO sequence () VALUES ();
DELETE FROM sequence WHERE sequence_id < LAST_INSERT_ID();
INSERT INTO private_messages (messageID, message)
                      VALUES (LAST_INSERT_ID(), 'the message');

第二个插入保证使用唯一的序列号。即使您有数十个不同的客户端程序连接到数据库,此保证也成立。这就是AUTO_INCREMENT的美妙之处。

第二个查询 (DELETE) 可防止表变大和浪费空间。我们不关心表中的任何行,除了最近的行。

编辑。如果您使用的是 php,只需使用对 mysqli_query() 的三次调用或您为程序选择的 MySQL 接口中的等效方法一个接一个地发出三个查询。

话虽如此,要提防虚假经济。 不要忘记,Amazon S3 上的存储费用为每年每 GB 0.36 美元。这是最昂贵的存储。将两种表放入单个表中的"浪费"存储成本可能达到几美元。对生产环境中损坏的数据库应用程序进行故障排除将花费数千美元。保持简单!

在单个表中使用像 1 这样的标志来表示私人消息,0 表示公共消息,因此易于插入,易于获取和比较。

messageId | message | flag
---------------------------
   1 | text1  | 1
   2 | text2  | 0
   3 | text3  | 0
   4 | text4  | 1
   5 | text5  | 0
我知道没有

办法自动执行此操作。

您也许可以在数据库中编写一个函数来实现它,我不建议这样做。

Mark Baker 的建议是,如果您绝对需要 ID 在两种类型的消息中都是唯一的,那么拥有一个messages表和一个公共/私有标志听起来是最好的方法。