3

プレフィックスを持つデータベース内のすべての列を削除するコマンドを phpMyAdmin で実行する方法を教えてtest_ください。

4

4 に答える 4

5

テーブルから列を削除するには、次の構文を使用します。

alter table <tablename> drop column <columnname>

test_ で始まるデータベース内のテーブル内のすべての列を検索するには、次の手順を実行します。

select column_name
from INFORMATION_SCHEMA.columns
where table_name = <table_name> and
      table_schema = <schema_name> and
      left(column_name, 5) = 'test_'  -- not using "like" because '_' is a wildcard char

これを手動で行っていた場合は、次のクエリを実行し、結果を mysql クエリ インターフェイスに貼り付けることをお勧めします。

select concat('alter table ', table_name, ' drop column ', column_name)
from INFORMATION_SCHEMA.columns
where table_name = <table_name> and
      schema_name = <schema_name> and
      left(column_name, 5) = 'test_'

クエリを実行し、結果を返し、各行をクエリとして実行することにより、コードで同様のことを行うことができます。

于 2012-08-26T20:49:33.907 に答える
3

実際にスキーマから列を削除したい場合は、必要な SQL コマンドを MySQL の情報スキーマ テーブルから動的に生成する必要があります。SQLプリペアドステートメントを使用してMySQLストアドプロシージャ内でそれを行うことは可能ですが、以下に示しますが、好みの開発言語で実装/理解する方が簡単であることに気付くかもしれません(質問では言及しません):

DELIMITER ;;

CREATE PROCEDURE dropMatchingColumns(IN pattern VARCHAR(64))
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE cur CURSOR FOR
    SELECT   CONCAT(
                 'ALTER TABLE `', REPLACE( TABLE_NAME, '`', '``'), '` ',
               GROUP_CONCAT(
                 'DROP COLUMN `', REPLACE(COLUMN_NAME, '`', '``'), '`'
               )
             )
    FROM     INFORMATION_SCHEMA.COLUMNS
    WHERE    COLUMN_NAME LIKE pattern AND TABLE_SCHEMA = DATABASE()
    GROUP BY TABLE_NAME
  ;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN cur;

  read_loop: LOOP
    FETCH cur INTO @sql;
    IF done THEN
      LEAVE read_loop;
    END IF;
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
  END LOOP;

  CLOSE cur;
END;;

DELIMITER ;

このプロシージャを定義すると、CALL dropMatchingColumns('test\_%');接頭辞が付いたすべての列をtest_現在のデータベースから削除するだけで済みます。

于 2012-08-26T20:48:07.510 に答える
2

MySQl Workbench を使用している場合は、一括選択を実行し、選択した列の一括削除をワークベンチに指示するだけで、複数の列を削除できます。

于 2013-07-25T11:59:27.940 に答える
1

私のように問題を抱えている人のために、この答えを説明または単純化したいと思います。

データベース「demo」のすべてのテーブルで「seq」という名前の列を削除するのに問題がありました。

次のようなものを使用して、各テーブル用にフォーマットされたコマンドで選択を作成できます。

Select concat('alter table ', table_name, ' drop column ', 'seq;')
from (select table_name
from INFORMATION_SCHEMA.tables
where table_name = table_name and
table_schema = 'demo') as t

これにより、'demo' データベース内の各テーブルに対して、alter table コマンドが作成されます。

結果を選択してコピーし、クエリ エディターに貼り付ける必要があります。

これは 2 段階のプロセスですが、これを数回行う必要がある場合は、コマンドをテキスト ファイルに保存して、後で再度実行します。

于 2015-04-20T11:16:59.697 に答える