繁体   English   中英

ALTER TABLE追加子查询的ENUM值

[英]ALTER TABLE to append ENUM values from subquery

我环顾了一阵子,但找不到解决办法。 我想运行一个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   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数据类型时要格外小心。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM