用存储过程处理插入值重复时(如果插入id值存在时,在存在id值增1后再插入)
create table ta(id int primary key,name varchar(20))
insert ta
select 1,'a'
union all select 2,'b'
union all select 3,'c'
union all select 12,'d'
union all select 13,'e'
用存储过程:
create proc test_p @id int,@name varchar(20)
as
begin
declare @j int,@sql varchar(1000)
if exists(select 1 from ta where id=@id)
begin
select @j=@id,@sql=''
while exists(select 1 from ta where id=@j)
begin
select @sql=@sql+','+rtrim(id) from ta where id=@j
select @j=@j+1
end
set @sql=stuff(@sql,1,1,'')
exec('update ta set id=id+1 where id in ('+@sql+')')
insert ta select @id,@name
end
else
insert ta select @id,@name
end
测试:
exec test_p 1,'f'
exec test_p 8,'h'
exec test_p 12,'g'
查询:
select * from ta
id name
----------- --------------------
1 f
2 a
3 b
4 c
8 h
12 g
13 d
14 e
(所影响的行数为 8 行)
--drop proc test_p
--drop table ta
分享到:
相关推荐
- **MyISAM**:由于MyISAM使用独立的文件存储自动增长的ID值,即使在删除了一些记录并重启MySQL服务后,新的记录ID也会继续从上一个最大ID值加1开始计算,即第18条记录的ID将是18。 - **InnoDB**:重启MySQL服务后,...
MySQL创建存储过程批量插入10万条数据 存储过程 1、首先防止主键冲突,我们清空表。 TRUNCATE table A_student; 2、编写存储过程 delimiter ‘$’; CREATE PROCEDURE batchInsert(in args int) BEGIN declare i int ...
2) /*设置循环次数*/ BEGIN WAITFOR DELAY ‘000:00:10’ /*延迟时间10秒*/ INSERT INTO time_by_day (time_id, the_date, the_year, month_of_year, quarter, day_of_month) SELECT TOP 1 time_id + 1 AS time_id,...
本文将探讨在SQL Server中,存储过程与`WHERE IN`子句结合使用时,处理多值参数的几种方法。 **方法一:拼接SQL字符串并调用`EXEC`** 这是最简单也是最直观的方法。你可以在存储过程中接收一个包含多个值的参数,...
这可以通过在插入前使用`SET IDENTITY_INSERT table_name ON`命令来实现,之后再用`SET IDENTITY_INSERT table_name OFF`关闭。 通过上述步骤和关键知识点的介绍,我们不仅了解了如何在SQL Server中创建存储过程来...
在打开游标后,通过一个`while`循环来不断读取游标中的数据,并将每一条学生ID插入到`DynamicEvaluation`表中。需要注意的是,使用`@@fetch_status`判断是否已经到达结果集的末尾,如果达到则通过`break`语句退出...
在这个系统中,包含了存储过程、插入触发器、删除触发器以及安全权限管理等多个关键组成部分,它们各自扮演着不同的角色,共同确保数据的完整性和安全性。 1. 存储过程: 存储过程是预编译的SQL语句集合,存储在...
首先,我们注意到在创建存储过程`myProc`时,使用了`delimiter $$`来改变MySQL客户端的语句分隔符,这是为了在存储过程中使用多个分号(;)而不会导致命令提前结束。存储过程的定义如下: ```sql CREATE PROCEDURE ...
在SQL Server 2005及更高版本中,我们可以使用`OUTPUT`子句来直接获取插入操作后生成的新`id`值。例如: ```sql INSERT INTO TestTable (CreatedDate) OUTPUT inserted.id VALUES (GETDATE()); ``` 这里,`...
插入金蝶任务单存储过程,自动获取ID,插入生产任务单。
在本示例中,我们关注的是如何使用存储过程实现插入更新数据的功能,这通常在数据同步或者避免重复数据时非常有用。 首先,让我们详细分析给出的存储过程代码: ```sql CREATE PROC Insert_Update @Id varchar(20...
在MySQL数据库中,存储过程是一种预编译的SQL语句集合,可以用于执行复杂的数据库操作,如删除重复记录。在给定的存储过程`DelDuplicateRecord`中,它旨在删除具有相同标题的记录,但仅保留每个标题下最早的一条记录...
当使用DataAdapter填充DataSet或DataTable时,可以设置`AcceptChangesDuringFill`属性为`false`,然后在插入新记录后调用`GetChanges`,这将返回一个只包含新插入记录的DataTable,从中获取新ID。 7. **存储过程**...
总结来说,存储过程在数据库管理中扮演着重要角色,尤其在处理增删改查等常见操作时,能提升效率,增强安全性,简化代码结构。理解并熟练运用存储过程,对于任何数据库开发者来说都是必备的技能。
存储过程是数据库开发中不可或缺的一部分,尤其在处理复杂的业务逻辑或频繁重复的操作时,其优势更为明显。通过学习和实践,我们可以更有效地管理和维护数据库系统。在实际项目中,还可以根据需求扩展存储过程的功能...
本文件主要讲述了如何使用Java进行CRUD操作,特别是涉及到存储过程的插入操作。以下是相关知识点的详细说明: 1. **Java与数据库连接**: Java通过`java.sql`包中的`DriverManager`类来管理数据库驱动,`...
6. **处理结果**:如果存储过程有返回结果,可以使用`CallableStatement.getObject()`等方法获取结果。 7. **关闭资源**:最后,记得关闭`CallableStatement`、`Connection`和其他打开的资源。 ### 增加数据 在...
然而这种方法存在一些局限性,比如在并发环境下可能会导致ID重复的问题。因此,某些数据库系统提供了更高效且安全的方法来直接获取自增字段的下一个值。本文将详细介绍如何不使用`MAX(id)+1`的方式获取自动增长字段...
SqlServer 在中获得自增ID的两种方式.存储过程或SQL语句中插入数据后,自动获取自增的ID
在Oracle中,创建一个用于插入数据的存储过程通常涉及到定义参数,这些参数将作为新记录的字段值。例如,我们可以创建一个名为`INSERT_EMPLOYEE`的过程,它接受员工的姓名、部门ID和薪水作为输入参数,然后将这些...