一尘不染

如何在MySQL中的两个或多个表中具有唯一ID?

mysql

我有一个表格events,其中包含所有新信息。该表用作所有新闻源查询的参考,因此从那里选择事件项,并从正确的表中检索与该事件相对应的信息。

现在,这是我的问题。我E_ID在事件表中有,它对应于不同表中事件的ID,例如T_IDfor tracksS_IDfor
status等等。这些ID可能相同,所以暂时我只是使用了一个不同的auto_increment值对于每个这样status在500
tracks上以0等开始的表。显然,我不想这样做,因为我还不知道哪个表中的数据最多。我以为status会很快超过tracks

该信息event通过触发器插入到表中。这是一个例子。

BEGIN
INSERT INTO events (action, E_ID, ID)
VALUES ('has some news.', NEW.S_ID, NEW.ID);
END

那是他的状态表。

我可以添加触发器以确保NEW.S_ID!= E_ID当前是否在使用中events,如果确实更改了它,则可以进行更改S_ID

另外,当自动递增时,是否可以使用某种键来引用事件,以S_ID使S_ID不会递增到的值E_ID

这些是我的想法,我认为后一种解决方案会更好,但我怀疑是否可能,但需要另一个参考表,而且过于复杂。


阅读 560

收藏
2020-05-17

共1个答案

一尘不染

在表之间要求唯一的ID的确很少见,但是这里有一个解决方案。

/* Create a single table to store unique IDs */
CREATE TABLE object_ids (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    object_type ENUM('event', ...) NOT NULL
) ENGINE=InnoDB;

/* Independent object tables do not auto-increment, and have a FK to the object_ids table */
CREATE TABLE events (
    id INT UNSIGNED NOT NULL PRIMARY KEY,
    ...
    CONSTRAINT FOREIGN KEY (id) REFERENCES object_ids (id)
) ENGINE=InnoDB;

/* When creating a new record, first insert your object type into the object_ids table */
INSERT INTO object_ids(object_type) VALUES ('event');
/* Then, get the auto-increment id. */
SET @id = LAST_INSERT_ID();
/* And finally, create your object record. */
INSERT INTO events (id, ...) VALUES (@id, ...);

显然,您将为events其他表复制表的结构。

2020-05-17