要擴大Anuya的回答(這是從http://kedar.nitty-witty.com/blog/mysql-stored-procedure-to-generate-extract-insert-statement參考)順便說一句...
首先需要一些輔助MySQL的函數:
/*
isNumeric - return 1/true if passed in string is numeric, false otherwise
Usage example: select isNumeric('2012-02-16'); => 0
*/
DROP FUNCTION IF EXISTS `bettermentdb`.`isNumeric`;
DELIMITER ;;
CREATE DEFINER=`betterment-web`@`localhost` FUNCTION `bettermentdb`.`isNumeric`(s varchar(255))
RETURNS TINYINT
DETERMINISTIC
BEGIN
SET @match ='^(([0-9+-.$]{1})|([+-]?[$]?[0-9]*(([.]{1}[0-9]*)|([.]?[0-9]+))))$';
RETURN IF(s regexp @match, 1, 0);
END;;
DELIMITER ;
/*
isNumeric - return an input wrapped in "'" if value is non-numeric, original otherwise.
Depends on isNumeric()
Usage example: select wrapNonNumeric(now()); => '2012-02-16'
select wrapNonNumeric(NULL); => NULL
select wrapNonNumeric(1); => 1
*/
DROP FUNCTION IF EXISTS `bettermentdb`.`wrapNonNumeric`;
DELIMITER ;;
CREATE DEFINER=`betterment-web`@`localhost` FUNCTION `bettermentdb`.`wrapNonNumeric`(s varchar(255))
RETURNS varchar(255)
DETERMINISTIC
BEGIN
RETURN IF(isNumeric(s), s, concat("'", s, "'"));
END;;
DELIMITER ;
輸出與山坳名安慰定義和非數字值用引號括起來,同時限制給定的輸入db.table行:
DELIMITER ;;
DROP PROCEDURE IF EXISTS GenerateInsertSQL;
CREATE DEFINER=`root`@`localhost` PROCEDURE GenerateInsertSQL(IN in_db varchar(20), IN in_table varchar(32), IN in_row BIGINT)
READS SQL DATA
BEGIN
DECLARE nullableValues varchar(1000);
DECLARE colNames varchar(1000);
DECLARE insertStmnt varchar(2000);
SELECT group_concat(concat('IFNULL(wrapNonNumeric(`',column_name,'`), "NULL")')) INTO @nullableValues from information_schema.columns where table_schema=in_db and table_name=in_table;
SELECT group_concat(concat('`',column_name,'`')) INTO @colNames from information_schema.columns where table_schema=in_db and table_name=in_table;
SET @insertStmnt=concat("select concat('INSERT INTO `", in_db, "`.`", in_table, "`(", @colNames, ") VALUES (', concat_ws(', ',",@nullableValues,"),');') from ", in_db, ".", in_table, " where id = ", in_row, " group by ", @colNames, ";");
PREPARE insertStmnt FROM @insertStmnt;
EXECUTE insertStmnt;
END
DELIMITER ;
SET @@ session.group_concat_max_len = 102400;用於列數太多的表格 – 2016-01-22 08:29:13