我有一个名为events
的表格,其中包含所有新信息。此表用作所有新闻订阅查询的参考,因此从那里选择事件项,并从正确的表中检索与该事件对应的信息。
现在,这是我的问题。我在事件表中有E_ID
个,它们对应于另一个表中的事件ID,T_ID
为tracks
,S_ID
为status
等等......这些ID可能是相同的,所以目前我只是为每个表使用了不同的auto_increment值,因此status
在0上tracks
开始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
的{{1}}!= events
以及相应地更改S_ID
。
或者,我可以使用某种键来自动递增S_ID
时引用事件,以便S_ID
不会增加到E_ID
的值。
这些是我的想法,我认为后一种解决方案会更好,但我怀疑它是否可能,或者它是否需要另一个参考表并且过于复杂。
答案 0 :(得分: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, ...);
显然,你会为其他表复制events
表的结构。
答案 1 :(得分:3)
您也可以使用通用唯一标识符(UUID)。
UUID被设计为在空间和时间上全球唯一的数字。对UUID()的两次调用预计会生成两个不同的值,即使这些调用是在两个彼此未连接的独立计算机上执行的。
请在manual中了解详情。
答案 2 :(得分:0)
UUID_SHORT()
应该做到这一点。
它将为您生成64位无符号整数。
根据文档,生成器逻辑是:
(server_id & 255) << 56
+ (server_startup_time_in_seconds << 24)
+ incremented_variable++;
如果满足以下条件,则UUID_SHORT()的值保证是唯一的:
当前服务器的server_id值介于0到255之间,并且在您的主服务器和从属服务器集中是唯一的
您没有在mysqld restarts之间设置服务器主机的系统时间
在mysqld restarts之间平均每秒调用UUID_SHORT()的次数少于1600万次
mysql> SELECT UUID_SHORT();
-> 92395783831158784
如果您好奇您的服务器ID是什么,可以使用以下任何一种:
SELECT @@server_id
SHOW VARIABLES LIKE 'server_id';