假设我在 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;
这应该为您提供 grp
和 id
之间的映射。
此时,您不应生成包含 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/