2

ユーザーがアンケートを作成する PHP スクリプトと、DB に受信データを格納するためのスクリプト テーブルがあります。このサイトはしばらく稼働しており、データベースには約 100 のテーブルがあります。

私のスクリプトにはひどく欠陥がありました!本当に「テキスト」が必要な場所に「小さなテキスト」フィールドが必要です。すべての tinytext 列をテキストに一括更新する方法はありますか?

ありがとう!

4

4 に答える 4

1

tinytextこれを行う 1 つの方法は、指定されたデータベース内のすべての列を見つけてからALTER TABLE、各列のステートメントを作成することです。ストアド プロシージャを使用した作業ソリューション:

DELIMITER $$

DROP PROCEDURE IF EXISTS `BULK_RETYPE` $$
CREATE PROCEDURE `BULK_RETYPE`(IN SCHEMA_NAME VARCHAR(255), IN FROM_TYPE VARCHAR(255), IN TO_TYPE VARCHAR(255))
BEGIN
    DECLARE `done` INT DEFAULT FALSE;
    DECLARE tn VARCHAR(255);
    DECLARE fn VARCHAR(255);
    DECLARE `cur1` CURSOR FOR
    SELECT
        `TABLE_NAME`,
    `COLUMN_NAME`
    FROM
        `information_schema`.`COLUMNS`
    WHERE
        `DATA_TYPE` = FROM_TYPE AND `TABLE_SCHEMA` = SCHEMA_NAME;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;


    OPEN cur1;
    read_loop: LOOP
        FETCH cur1 INTO `tn`, `fn`;
        IF done THEN
          LEAVE read_loop;
        END IF;

          SET @ALTER_SQL = CONCAT('ALTER TABLE ', '`', tn,'`' , ' MODIFY ', '`', fn,'`' , ' ', TO_TYPE);

          PREPARE stmt1 FROM @ALTER_SQL;
          EXECUTE stmt1;

    END LOOP;   
    CLOSE cur1; 
END $$

DELIMITER ;
CALL BULK_RETYPE('test', 'tinytext', 'text');
于 2013-11-13T09:31:52.243 に答える
0

スキーマから選択するだけで、一括変更用の SQL を準備できます

SELECT table_scheme, table_name, columun_name FROM information_schema.`COLUMNS`
WHERE DATA_TYPE='tinyint'
于 2015-02-02T11:17:17.617 に答える