mysql - ALTER TABLE 附加子查询中的 ENUM 值

标签 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 是“邪恶的”,以防万一您要提到这一点。

最佳答案

不可以,此操作不能在单个语句中执行。

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/

相关文章:

java - Mysql JDBC 驱动程序 ClassNotFoundException

c++ - 使用嵌套 C++ 类和枚举的优缺点?

javascript - 页面加载偏移值设置为 0。计算检查值

MySQL 竞争条件

javascript - 识别 JavaScript 中的并行异步调用堆栈

mysql - 为什么带括号和不带括号的 UNION ALL 的行为不同?

mysql - Entity Framework : Add new object and link to 2nd new object via navigational property

php - Symfony2/Doctrine2 中的枚举启用问题

java - 在枚举中模拟注入(inject)

java - 线程中的异常 "AWT-EventQueue-0"org.hibernate.QueryException : could not resolve property: Id of: