mysql - 如何自动递增唯一值

标签 mysql innodb mysql-workbench auto-increment

假设我在 mysql 工作台和 Innodb 引擎中有这个表,两列都是主键:

+--------+---------+
| grp    | name    |
+--------+---------+
| fish   | lax     |
| mammal | dog     |
| mammal | bat     |
| mammal | whale   |
| bird   | bat     |
| bird   | ostrich |
+--------+---------+

如何添加列,其行为与 grp 列类似:

+--------+----+---------+
| grp    | id | name    |
+--------+----+---------+
| fish   |  1 | lax     |
| mammal |  2 | dog     |
| mammal |  2 | cat     |
| mammal |  2 | whale   |
| bird   |  3 | penguin |
| bird   |  3 | ostrich |
+--------+----+---------+

请注意,我想要更改的实际表要大得多。另请注意,这不是 MyISAM 自动递增所做的事情,也不是此处询问的问题(但答案可能会有所帮助):How to auto increment on different foreign keys?

最佳答案

CREATE TABLE Groups (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    grp VARCHAR...
    PRIMARY KEY(id),
    UNIQUE(grp)
        ) ENGINE=InnoDB
    SELECT DISTINCT grp FROM YourTable;

这应该为您提供 grpid 之间的映射。

此时,您不应生成包含 3 列的表 (grp+id+name),而应使用上面的 Groups 作为“规范化”,您似乎正在这样做。然后做

CREATE TABLE New LIKE YourTable;
ALTER TABLE New
    ADD  COLUMN id INT UNSIGNED NOT NULL,
    DROP COLUMN grp;
# Note: if you have an index on grp, something else may need to be done.
INSERT INTO New
    SELECT g.id, y.name
        FROM Groups g
        JOIN YourTable y  ON y.grp = g.grp;
# At this point, verify that `New` has what you want.  Then switch over:
RENAME TABLE YourTable TO Old, New TO YourTable;
DROP TABLE Old;

编辑 我选择创建一个新表而不是更新现有表 - 因为它(我认为)会快得多。使用UPDATE,所有行都需要被锁定。使用INSERT..SELECT,它们就可以轻松创建。

关于mysql - 如何自动递增唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31642400/

相关文章:

mysql - 选择发件人向 5 个或更多不同目标发送 5 条或更多邮件的所有位置

java - where子句中的未知列错误,使用MySQL和Java

服务中缺少 MySql - 无法打开 innodb_index_stats.ibd

MySQL InnoDB : autoincrement non-primary key

mysql - 更改 MySQL Workbench 快捷键 mac osx?

mysql - mysql workbench 6.3数据导出错误

javascript - 为什么我的 jQuery Ajax GET 请求没有收到服务器的响应?

php - 我想通过托管在远程服务器上的 php 脚本访问本地 mysql 数据库

mysql - 提高 Case When 性能?

mysql - MYSQL中的交叉检测