2

varchar/char を列挙型に変換する簡単な方法はありますか? 私はこれをやろうとしましたが、うまくいきません

alter table zipcodes add column state_short_enum enum(
    (select state_short from zipcodes group by state_short)
)

次のエラーが表示されます。

#1064 - You have an error in your SQL syntax; check the manual that corresponds
to your MySQL server version for the right syntax to use near 
'(select state_short from zipcodes group by state_short))' at line 1
4

2 に答える 2

1

列挙値はリテラルでなければならないため、ユーザー変数やスカラー サブクエリは使用できません。おそらく、ALTERステートメントを文字列として作成する必要があります。

例:

SET @codes := CONCAT((SELECT GROUP_CONCAT(CONCAT("'", state_short, "'")) FROM zipcodes), "'");
SET @alter_sql := CONCAT('ALTER TABLE `zipcodes` ADD `state_short_enum` ENUM(', @codes, ')');
PREPARE stmt FROM @alter_sql;
EXECUTE stmt;
于 2013-03-19T02:50:27.820 に答える
0

すでに時代遅れの質問ですが、同様の問題を解決しようとしているときに見つけました。バージョン 8.0 までの MySQL には、使いやすい「 procedure analyze 」があります。

select * from t procedure analyse()\G

「Optimal_fieldtype」列に最適なフィールドタイプが表示されます。この結果は、alter で直接使用できます。

alter table t change column col1 enum(...) not null;

もちろん、alter を実行する前にすべての予防措置を講じる必要があります (バックアップを作成し、alter 中にテーブルに保持されたロックが通常のアクティビティを中断しないようにします)。

于 2017-05-31T04:18:30.973 に答える