我有一张名为events所有新信息的表格.此表用作所有新闻订阅查询的参考,因此从那里选择事件项,并从正确的表中检索与该事件对应的信息.
现在,这是我的问题.我E_ID在事件表中对应于不同表中事件的ID,无论是T_IDfor tracks,S_IDfor status等等......这些ID可能是相同的,所以暂时我只使用了不同的auto_increment值对于每个表,所以status从500开始tracks0等等.显然,我不想这样做,因为我不知道哪个表将拥有最多的数据.我认为status会很快超过tracks.
信息将event通过触发器插入表中.这是一个例子;
BEGIN
INSERT INTO events (action, E_ID, ID)
VALUES ('has some news.', NEW.S_ID, NEW.ID);
END
Run Code Online (Sandbox Code Playgroud)
那是他的状态表.
是否有一个额外的触发器,我可以确保NEW.S_ID!= a E_ID当前进入events,如果它确实改变了S_ID相应的.
或者,是否有某种键可用于在自动递增时引用事件,S_ID以便S_ID不会增加到值E_ID.
这些是我的想法,我认为后一种解决方案会更好,但我怀疑它是否可能,或者它是否需要另一个参考表并且太复杂了.
Ste*_*ley 13
在表格中要求一个唯一的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, ...);
Run Code Online (Sandbox Code Playgroud)
显然,您将为events其他表复制表的结构.