【发布时间】:2015-10-17 00:10:48
【问题描述】:
假设我在 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?
【问题讨论】:
-
也许查看触发器,查询它是否在其中,从
id列中获取MAX并递增一 -
好吧,正确的方法(在广泛接受的数据库规范化概念中)是在该表中没有这样的列 - 新 ID 属于
grp表,它可以从作为外键引用(而不是重复组名)。 -
@IMSop ,这正是我想要在现有数据库中做的事情。这将是第一步。然后我会将 (grp,id) 对插入到一个新表中(或更新一个现有的空表),这是您提到的 grp 表。之后我会从第一个表中删除 grp 列。另一种方法是首先使用自动增量 id 和该表的 grp 值创建 grp 表。假设第一个表是动物,我添加了空的 id 列。然后我必须这样做: UPDATE Animals as A, Grp as G SET A.id=G.id WHERE A.grp=G.grp;这种方式的复杂度是O(sizeA * sizeG),太大了
-
@IMSop 我的表大小是 200k 和 100k。我在一夜之间离开了那个更新,它完成了,但必须有一个更快的解决方案。因此,找到一种方法可以在表 A 中创建 id,然后只插入对应该具有 O(sizeA + sizeG) 的复杂度,这很好。
-
我不确定您是如何计算这些复杂度值的。无论哪种方式,您都必须更新表中的每一行一次,并且您必须查找该行所属的组才能这样做。唯一可以改变的是查找的方式。如果组数较少,您甚至可以进行多次更新,例如
SET grpid=4 WHERE grp='fish'"
标签: mysql innodb mysql-workbench auto-increment