3

私は2つのテーブルを持っています。1 つはフィールド情報テーブルで、もう 1 つはフィールド データ テーブルです。

デフォルトでは、すべてのフィールド データ テーブルの列は、何らかの種類のテキスト フィールド (varchar、text など) に設定されます。

私がやりたいことはこれです。手動の ALTER TABLE クエリを作成する代わりに:

ALTER TABLE `field_data` 
CHANGE COLUMN `field_id_2` `field_id_2` decimal NOT NULL, 
CHANGE COLUMN `field_id_3` `field_id_3` decimal NOT NULL,
CHANGE COLUMN `field_id_22` `field_id_22` decimal NOT NULL,
CHANGE COLUMN `field_id_23` `field_id_23` decimal NOT NULL,
CHANGE COLUMN `field_id_25` `field_id_25` decimal NOT NULL,
CHANGE COLUMN `field_id_27` `field_id_27` decimal NOT NULL,
CHANGE COLUMN `field_id_30` `field_id_30` decimal NOT NULL,
CHANGE COLUMN `field_id_66` `field_id_66` decimal NOT NULL,
CHANGE COLUMN `field_id_72` `field_id_72` decimal NOT NULL;

field_info テーブルに基づいて動的な ALTER TABLE クエリを作成したいと思います。現在、次のクエリを実行してこれらのフィールド ID を取得しています。

SELECT field_id FROM `field_info` WHERE `field_type` = 'a_decimal_field'

2、3、22、23 などの値を返します。

そのため、field_id_ を各サブ選択の結果に連結するサブ選択に基づいてテーブルを変更し、その列の型を 10 進数に変更するクエリが必要になります (可能であれば)。

クエリを作成することでphpでこれを実行できることは知っていますが、可能であれば純粋なmysqlソリューションを具体的に探しています。

4

1 に答える 1

8
SELECT CONCAT('ALTER TABLE `field_data` ', 
  GROUP_CONCAT(' CHANGE COLUMN `field_id_', field_id, '` ',
    ' `field_id_', field_id, '` DECIMAL NOT NULL')) 
FROM `field_info` 
WHERE `field_type` = 'a_decimal_field'
INTO @sql;

PREPARE stmt FROM @sql;

EXECUTE stmt;
于 2013-02-11T02:57:14.033 に答える