我已经看了一会儿,但我找不到答案。我想运行一个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')
显然不能像第一个那样附加到第一个。
我已经看到某些方法使用PREPARE
和EXECUTE
,或者通过dbi(perl),但我想知道是否可以不使用它们。即,我想知道它是否可以在一个声明中完成,并避免竞争条件。
另外,我知道ENUM
是"邪恶",如果您要提及的话。
答案 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
数据类型。)