MySQL/MariaDB SQL:如何找到以特定字母模式开头的表,然后在找到的集中操作列?

xxls0lw8  于 2023-06-22  发布在  Mysql
关注(0)|答案(1)|浏览(102)

我想找到一种更专业的方法来操作选定表中的某些列。
我知道如何选择以特定字母模式开头的表格:

SELECT  TABLE_NAME
FROM    INFORMATION_SCHEMA.TABLES
WHERE   TABLE_NAME LIKE 'prefix_mm_%'

我还知道如何在更改数据类型时将数据从一列复制到另一列(这里是从UNIXTIME到TIMESTAMP):

UPDATE pages
    SET date_created = FROM_UNIXTIME(other_date_created_column)

但是我有很多这样的prefix_mm_%表,我不希望对每个表都手动执行此操作。
所以我想知道:有没有一种方法可以选择所有相关的表,然后一次操作所有的列?

wnavrhmk

wnavrhmk1#

在我看来,你想:

  • 查询表名并将其存储在变量/游标中。
  • 循环通过光标
  • 生成和执行动态SQL语句

理想的语言是PL/SQL,但MySQL不支持它。但是,类似这样的东西可以工作:

DELIMITER //

CREATE PROCEDURE add_new_column()
BEGIN
  DECLARE table_name VARCHAR(100);
  DECLARE done INT DEFAULT FALSE;
  DECLARE cur CURSOR FOR
    SELECT TABLE_NAME
    FROM information_schema.TABLES
    WHERE TABLE_SCHEMA = 'your_schema_name'
      AND TABLE_NAME LIKE 'xyz111%';

  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN cur;

  read_loop: LOOP
    FETCH cur INTO table_name;
    IF done THEN
      LEAVE read_loop;
    END IF;

    SET @alter_query := CONCAT('ALTER TABLE ', table_name, ' ADD COLUMN date_column2 DATE');
    PREPARE stmt FROM @alter_query;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

    SET @update_query := CONCAT('UPDATE ', table_name, ' SET date_column2 = date_column');
    PREPARE stmt FROM @update_query;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
  END LOOP;

  CLOSE cur;
END //

DELIMITER ;

相关问题