我正在将数据库从Windows迁移到Linux,我遇到了表名大写的问题。虽然通常情况下,在Linux中,表格首字母大写在Windows中,但它们都变成了小写,使得它们无法在Linux中再次运行。我不能搞乱服务器的sql设置,所以我正在寻找一个可以解决我的问题的查询。在做了一些研究之后,我结合了一些结果并最终得到了下面的查询,但它不起作用,因为第二个concat带来了一个数字。任何解决方案?
use information_schema;
SELECT
CONCAT('RENAME TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' TO ', TABLE_SCHEMA, '.', TABLE_NAME = CONCAT(UCASE(LEFT(TABLE_NAME, 1)),LCASE(SUBSTRING(TABLE_NAME, 2))), ';')
FROM
information_schema.tables
WHERE `TABLE_SCHEMA` = "test";
答案 0 :(得分:1)
那个TABLE_NAME =让你失败了尝试:
use information_schema;
SELECT
CONCAT('RENAME TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' TO ', TABLE_SCHEMA, '.', CONCAT(UCASE(LEFT(TABLE_NAME, 1)),LCASE(SUBSTRING(TABLE_NAME, 2))), ';')
FROM
information_schema.tables
WHERE `TABLE_SCHEMA` = "test";
答案 1 :(得分:0)
我最近一直在苦苦挣扎,写了一个存储过程来处理表格的第一个字母大写问题。它使用前一个答案的SELECT
语句来填充临时表。然后它迭代这个临时表并执行de语句。这个过程非常简单,因为它没有语法智能,所以这取决于你。
在这里:
CREATE DEFINER=`root`@`localhost` PROCEDURE `aux_uppercase_tablename`()
PROC: BEGIN
/*
Procedimiento que pone en mayúsculas la primera letra del nombre de las tablas,
excluyendo las tablas de auditoría (hay que mejorar el script para que lo haga).
No tiene la inteligencia para separar los nombres de tablas formados por dos o mas palabras,
por ejemplo, lineaventa, lineascomprobante, etc.
*/
DECLARE pIndex int;
DECLARE pInstruction varchar(500);
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SELECT 'Error al procesar.' Mensaje;
ROLLBACK;
END;
SET @rowNum = 0;
DROP TEMPORARY TABLE IF EXISTS tmp_instructions;
CREATE TEMPORARY TABLE tmp_instructions ENGINE = MEMORY
SELECT (@rowNum := @rowNum + 1) rowNum, CONCAT('RENAME TABLE ', TABLE_NAME,
' TO ' ,CONCAT(UCASE(LEFT(TABLE_NAME,1)),SUBSTRING(TABLE_NAME,2)),';') instruction
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'your_schema';
SET pIndex = 1;
WHILE (pIndex <= @rowNum) DO
SET pInstruction = (SELECT instruction FROM tmp_instructions WHERE rowNum = pIndex);
SET pIndex = pIndex + 1;
CALL ssp_eval(pInstruction);
END WHILE;
DROP TEMPORARY TABLE IF EXISTS tmp_instructions;
SELECT 'OK';
END
ssp_eval过程如下:
CREATE DEFINER=`root`@`localhost` PROCEDURE `ssp_eval`(pCadena mediumtext)
BEGIN
/*
Permite ejecutar una sentencia preparada leída de la base de datos,
como implementación de polimorfismo.
*/
-- SELECT pCadena;
SET @Cadena = pCadena;
PREPARE STMT FROM @Cadena;
EXECUTE STMT;
DEALLOCATE PREPARE STMT;
END
希望每个人都能解决这个问题!问候。