mysql 判断是否已存在及插入表数据 的 简单存储过程
2010-10-14 19:19
513 查看
处理思路:
1、查找判断 相同数据是否已存在
2、如不存在,则执行Insert操作
CREATE PROCEDURE `mysql_sp_insert_data`(
IN p_TableName varchar(100) --表名
, IN p_ColumnNames varchar(200) --字段组合 ,以","分隔
, IN p_ColumnDatas varchar(500) --数据组成 ,以"@"分隔
)
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
declare tmpExistDataCount int(4);
declare tmpWhere varchar(800);
declare tmpSqlStr varchar(1000);
declare tmpSqlToRun varchar(2000);
declare tmpSplitName varchar(10);
declare tmpSplitData varchar(10);
declare tmpNames varchar(800);
declare tmpDatas varchar(800);
declare tmpIndexName int(4);
declare tmpIndexData int(4);
set tmpNames = p_ColumnNames;
set tmpDatas = p_ColumnDatas;
set tmpSplitName = ",";
set tmpSplitData = "@";
set tmpWhere = " where 1 = 1 ";
select INSTR(tmpNames,tmpSplitName) into tmpIndexName;
if tmpIndexName > 0 then
while tmpIndexName > 0 do
select INSTR(tmpNames,tmpSplitName) into tmpIndexName;
select INSTR(tmpDatas,tmpSplitData) into tmpIndexData;
set tmpWhere = concat(tmpWhere , " and " , SUBSTRING(tmpNames,1,tmpIndexName -1) ," = ");
set tmpWhere = concat(tmpWhere , SUBSTRING(tmpDatas,1,tmpIndexData -1 ) );
set tmpNames = SUBSTRING(tmpNames,tmpIndexName + 1,LENGTH(tmpNames) - tmpIndexName);
set tmpDatas = SUBSTRING(tmpDatas,tmpIndexData + 1,LENGTH(tmpDatas) - tmpIndexData);
select INSTR(tmpNames,tmpSplitName) into tmpIndexName;
end while;
end if;
if LENGTH(tmpNames) > 0 then
set tmpWhere = concat(tmpWhere , " and " , tmpNames ," = ");
set tmpWhere = concat(tmpWhere , tmpDatas );
end if;
set tmpSqlStr = " select count(*) ";
set tmpSqlStr = concat(tmpSqlStr ," from ", p_TableName ,tmpWhere , " ; " );
set @sql1 = tmpSqlStr;
prepare tmpSqlToRun from @sql1;
select ( tmpSqlStr) into tmpExistDataCount;
if tmpExistDataCount = 0 then
set p_ColumnDatas = REPLACE(p_ColumnDatas,tmpSplitData,",");
set tmpSqlStr = " ";
set tmpSqlStr = concat(tmpSqlStr ," insert into " , p_TableName);
set tmpSqlStr = concat(tmpSqlStr ," ( ", p_ColumnNames, " ) values ( " ,p_ColumnDatas , " ) ;" );
SET @sql = tmpSqlStr;
prepare tmpSqlToRun from @sql;
-- select tmpSqlStr;
execute tmpSqlToRun;
end if;
END;
--测试
CREATE TABLE `table1` (
`field1` int(11) NOT NULL,
`field2` varchar(20) DEFAULT NULL,
`field3` datetime DEFAULT NULL,
PRIMARY KEY (`field1`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
call mysql_sp_insert_data("table1","field1,field2,field3","1@'1'@null");
1、查找判断 相同数据是否已存在
2、如不存在,则执行Insert操作
CREATE PROCEDURE `mysql_sp_insert_data`(
IN p_TableName varchar(100) --表名
, IN p_ColumnNames varchar(200) --字段组合 ,以","分隔
, IN p_ColumnDatas varchar(500) --数据组成 ,以"@"分隔
)
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
declare tmpExistDataCount int(4);
declare tmpWhere varchar(800);
declare tmpSqlStr varchar(1000);
declare tmpSqlToRun varchar(2000);
declare tmpSplitName varchar(10);
declare tmpSplitData varchar(10);
declare tmpNames varchar(800);
declare tmpDatas varchar(800);
declare tmpIndexName int(4);
declare tmpIndexData int(4);
set tmpNames = p_ColumnNames;
set tmpDatas = p_ColumnDatas;
set tmpSplitName = ",";
set tmpSplitData = "@";
set tmpWhere = " where 1 = 1 ";
select INSTR(tmpNames,tmpSplitName) into tmpIndexName;
if tmpIndexName > 0 then
while tmpIndexName > 0 do
select INSTR(tmpNames,tmpSplitName) into tmpIndexName;
select INSTR(tmpDatas,tmpSplitData) into tmpIndexData;
set tmpWhere = concat(tmpWhere , " and " , SUBSTRING(tmpNames,1,tmpIndexName -1) ," = ");
set tmpWhere = concat(tmpWhere , SUBSTRING(tmpDatas,1,tmpIndexData -1 ) );
set tmpNames = SUBSTRING(tmpNames,tmpIndexName + 1,LENGTH(tmpNames) - tmpIndexName);
set tmpDatas = SUBSTRING(tmpDatas,tmpIndexData + 1,LENGTH(tmpDatas) - tmpIndexData);
select INSTR(tmpNames,tmpSplitName) into tmpIndexName;
end while;
end if;
if LENGTH(tmpNames) > 0 then
set tmpWhere = concat(tmpWhere , " and " , tmpNames ," = ");
set tmpWhere = concat(tmpWhere , tmpDatas );
end if;
set tmpSqlStr = " select count(*) ";
set tmpSqlStr = concat(tmpSqlStr ," from ", p_TableName ,tmpWhere , " ; " );
set @sql1 = tmpSqlStr;
prepare tmpSqlToRun from @sql1;
select ( tmpSqlStr) into tmpExistDataCount;
if tmpExistDataCount = 0 then
set p_ColumnDatas = REPLACE(p_ColumnDatas,tmpSplitData,",");
set tmpSqlStr = " ";
set tmpSqlStr = concat(tmpSqlStr ," insert into " , p_TableName);
set tmpSqlStr = concat(tmpSqlStr ," ( ", p_ColumnNames, " ) values ( " ,p_ColumnDatas , " ) ;" );
SET @sql = tmpSqlStr;
prepare tmpSqlToRun from @sql;
-- select tmpSqlStr;
execute tmpSqlToRun;
end if;
END;
--测试
CREATE TABLE `table1` (
`field1` int(11) NOT NULL,
`field2` varchar(20) DEFAULT NULL,
`field3` datetime DEFAULT NULL,
PRIMARY KEY (`field1`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
call mysql_sp_insert_data("table1","field1,field2,field3","1@'1'@null");
相关文章推荐
- mysql插入前判断数据是否存在
- mysql插入前判断数据是否存在
- INSERT INTO .. SELECT ... FROM DUAL WHERE.插入数据前判断表中是否已经存在
- 查找存储过程,判断mysql是否存在此列
- mysql创建数据表时如何判断是否已经存在?
- MySQL存储过程----创建索引前,先判断索引是否已经存在,如果存在,则不添加,如果不存在,添加
- MySQL 判断记录是否存在,不存在则插入存在则更新
- mysql创建数据表时如何判断是否已经存在?
- sqlserver 判断当前数据是否存在 不存在则插入
- 简单的方法实现判断Mysql内某个字段Fields是否存在
- 判断SQL数据库、数据表、存储过程、视图、函数是否存在的方法
- oracle插入数据前判断是否存在
- 判断SQL数据库、数据表、存储过程、视图、函数是否存在的方法
- mysql insert exists || mysql 判断数据是否存在
- Oracle触发器实现更新一张表数据时判断另一张表是否存在,存在更新数据,不存在插入数据
- oracle先判断数据是否存在再插入
- SQL触发器--插入时判断数据是否已存在
- mysql中如何判断 一个数据表是否已经存在
- mysql 判断表数据是否存在,然后修改
- mysql创建数据表时如何判断是否已经存在?