【问题标题】:Changing the Value of a MySQL ENUM Value, Throughout a Table在整个表中更改 MySQL ENUM 值的值
【发布时间】:2011-09-22 05:23:00
【问题描述】:

我想知道是否可以在整个表中更改 ENUM 值,以便在表示所述 ENUM 值的所有行中也进行更改。

【问题讨论】:

  • 使用更新语句? UPDATE table1 SET enum1 = 'male' WHERE enum1 = 'female'
  • @Johan - 这不会造成任何问题吗?我猜它必须在使用 ALTER 更改 ENUM 值本身之前完成。但是会被允许吗?我想知道,因为我认为只允许在枚举列中选择指定的值?如果尚未指定新值...
  • 先修改后更新,不能将枚举设置为create table/alter table语句中未设置的值。

标签: mysql database-design enums


【解决方案1】:

如果你想改变一个枚举的值:

假设您的旧枚举是:

ENUM('English', 'Spanish', 'Frenchdghgshd', 'Chinese', 'German', 'Japanese') 

改变这种用法:

--  Add a new enum value
ALTER TABLE `tablename` CHANGE `fieldname` `fieldname` ENUM   
('English', 'Spanish', 'Frenchdghgshd', 'Chinese', 'German', 'Japanese', 'French');
-- Update the table to change all the values around.
UPDATE tablename SET fieldname = 'French' WHERE fieldname = 'Frenchdghgshd';
-- Remove the wrong enum from the definition
ALTER TABLE `tablename` CHANGE `fieldname` `fieldname` ENUM   
('English', 'Spanish', 'Chinese', 'German', 'Japanese', 'French');

MySQL 可能会遍历表中的所有行来尝试更新内容,我听说过有关计划优化的故事,但我不确定这是否真的发生了。

【讨论】:

  • 所以您认为 MySQL 会自动遍历数据库并进行所需的任何更改?我在想另一种方法是使用ALTER 将新的ENUM添加到集合中,然后使用UPDATE 替换旧值表中的任何实例,用新的价值。最后,使用ALTER 删除旧的ENUM 值。你觉得这样行吗?
  • 枚举并没有真正将字符串存储在字段中,它只是使用将保存枚举中的值的最小整数,通常是 tinyint。如果您经常更改枚举 mysql 中的字符串,则不必对行做任何事情
  • 是的,虽然如果你改变枚举的顺序,MySQL 也会进入所有行并重新排列字段中的值。所以如果你有 enum('yes','no') 而你 alter table t1 change enum1 enum1 enum ('no','yes') 所有的 no 和 yes 都将保持不变。
  • 对不起,-1,这不起作用。你必须按照@stefmikhail所说的去做,即ALTER TABLEadd新的ENUM值,UPDATE并用新的替换旧的,和@ 987654332@ 再次删除旧的枚举值。 @Johan 也许您的示例有效,因为FrenchdghgshdFrench 开头,但是如果您将French 更改为Française,则需要两个ALTER TABLEs 和一个UPDATE
  • @Josh,更新了答案,以反映您的意见,谢谢。
猜你喜欢
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多