我有一个表格events,其中包含所有新信息。该表用作所有新闻源查询的参考,因此从那里选择事件项,并从正确的表中检索与该事件相对应的信息。
events
现在,这是我的问题。我E_ID在事件表中有,它对应于不同表中事件的ID,例如T_IDfor tracks,S_IDfor status等等。这些ID可能相同,所以暂时我只是使用了一个不同的auto_increment值对于每个这样status在500 tracks上以0等开始的表。显然,我不想这样做,因为我还不知道哪个表中的数据最多。我以为status会很快超过tracks。
E_ID
T_ID
tracks
S_ID
status
该信息event通过触发器插入到表中。这是一个例子。
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。
NEW.S_ID
另外,当自动递增时,是否可以使用某种键来引用事件,以S_ID使S_ID不会递增到的值E_ID。
这些是我的想法,我认为后一种解决方案会更好,但我怀疑是否可能,但需要另一个参考表,而且过于复杂。
在表之间要求唯一的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其他表复制表的结构。