我环顾了一段时间,但找不到这个问题的答案。我想运行一个 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
是“邪恶的”,以防万一您要提到这一点。
最佳答案
不可以,此操作不能在单个语句中执行。
ALTER TABLE
语句不支持运行 SELECT
子查询。这就是为什么您会发现这样的情况:正在运行一个单独的 SELECT
语句,然后运行第二个 ALTER TABLE
语句。
跟进
要使此类操作成为“原子”操作,您需要获得表上的独占锁。 ALTER TABLE
确实获得了独占锁,但我认为您正在询问两个 session ...
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')
为了防止一个“覆盖”另一个,您需要建立某种锁定机制来防止两个 session 同时执行此操作。
(我不认为 ENUM
是邪恶的;是的,有一些限制,我们在使用 ENUM
数据类型时需要小心。)
关于mysql - ALTER TABLE 附加子查询中的 ENUM 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30034289/