[英]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')
显然不能仅将其附加到第一个。
我已经看到了某些使用PREPARE
和EXECUTE
,或者通过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.