ALTER TABLE从子查询中追加ENUM值

时间:2015-05-04 15:47:16

标签: mysql enums race-condition alter-table

我已经看了一会儿,但我找不到答案。我想运行一个ALTER TABLE来将值附加到ENUM字段,而不会遇到任何竞争条件。我能想到的最好的方法是类似的:

ALTER TABLE 'my_table' MODIFY COLUMN 'my_enum' *results_from_subquery_here*

子查询的位置如下:

(SELECT column_type,  concat(TRIM(TRAILING ')' FROM column_type),",'new_enum_value')")
FROM information_schema.columns
as T
WHERE table_name = 'my_table'
and column_name ='my_enum')

显然不能像第一个那样附加到第一个。

我已经看到某些方法使用PREPAREEXECUTE,或者通过dbi(perl),但我想知道是否可以不使用它们。即,我想知道它是否可以在一个声明中完成,并避免竞争条件。

另外,我知道ENUM是"邪恶",如果您要提及的话。

1 个答案:

答案 0 :(得分:1)

不,此操作无法在单个语句中执行。

ALTER TABLE语句不支持运行SELECT子查询。这就是为什么你找到了你找到的东西:运行一个单独的SELECT语句,然后运行第二个ALTER TABLE语句。

<强>后续

要使此类操作成为“原子”,您需要在表上获得独占锁。 ALTER TABLE确实获得了排他锁定,但我认为你要问的是两次会议......

session   operation
-------   -----------------------
one       get enum defn ('a','b') and add 'c'
two       get enum defn ('a','b') and add 'fee'
two       set enum defn ('a','b','fee')
one       set enum defn ('a','b','c')

为了防止一个人“覆盖”另一个,你需要建立某种锁定机制来阻止两个会话同时执行这个操作。

(我不认为ENUM是邪恶的;是的,有一些限制,我们需要注意使用ENUM数据类型。)