如何在MySQL中的两个或多个表中使用唯一ID?

时间:2013-06-06 12:01:48

标签: mysql

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

现在,这是我的问题。我在事件表中有E_ID个,它们对应于另一个表中的事件ID,T_IDtracksS_IDstatus等等......这些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的值。

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

3 个答案:

答案 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中了解详情。

还有shorter version

答案 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';