>我有 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
表和一个公共/私有标志听起来是最好的方法。