首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

请问如何处理重复记录的insert

2012-01-09 
请教如何避免重复记录的insert一个表含以下三列idoiddate1122007-10-02 16:03:40.7972122007-10-02 16:03:

请教如何避免重复记录的insert
一个表含以下三列
id oid date
1 12 2007-10-02 16:03:40.797
2 12 2007-10-02 16:03:40.920 ------该条记录不允许
3 12 2007-10-03 16:03:40.920 ------该条记录允许

id为自增列,oid为编号,date为插入记录的时间

现在希望在同一天内,不插入oid相同的记录。




[解决办法]
你用oid和date组成主键就行了阿

[解决办法]
CREATE TABLE T
(
id int identity(1,1),
old int,
[date] datetime
)

GO

CREATE TRIGGER TR_T
ON T
INSTEAD OF INSERT
AS
 SET XACT_ABORT ON
 BEGIN TRAN
IF NOT EXISTS ( SELECT * FROM INSERTED A WHERE EXISTS ( SELECT * FROM T B WHERE A.old = b.old
AND CONVERT(CHAR(10),A.[date],120)
= CONVERT(CHAR(10),B.[date],120) ))
INSERT INTO T
SELECT old,[date] FROM INSERTED
COMMIT TRAN
GO

INSERT INTO T
 VALUES (12,'2007-10-02 16:03:40.797') 
INSERT INTO T
 VALUES (12,'2007-10-02 16:03:40.920') 
INSERT INTO T
 VALUES (12,'2007-10-03 16:03:40.920') 

SELECT * FROM T
DROP TRIGGER TR_T
DROP TABLE T

id old date
----------- ----------- ------------------------------------------------------ 
1 12 2007-10-02 16:03:40.797
2 12 2007-10-03 16:03:40.920

(所影响的行数为 2 行)
[解决办法]
你现在要进行的操作是什么?
是要删除所谓的同一天重复的数据, 
还是要限制当插入数据时,如果今天已插入过一条,不允许再插入?
[解决办法]
一个表含以下三列 
id oid date 
1 12 2007-10-02 16:03:40.797 
2 12 2007-10-02 16:03:40.920 ------该条记录不允许 
3 12 2007-10-03 16:03:40.920 ------该条记录允许 

id为自增列,oid为编号,date为插入记录的时间 

现在希望在同一天内,不插入oid相同的记录。 

declare @old as int
declare @date as datetime
set @old = 12
set @date = '2007-10-02'
if not exists (select * from tb where old = @old and convert(varchar(10),date 120) = convert(varchar(10),@date,120))
insert ....
[解决办法]

只是提供一下思路。和楼主意图不一致。
Delete from MyTable where oid not in (
select top 1 oid from MyTable where date between 2007-10-02 and 2007-10-03 order by date)

1.从表中选出在某一天内按时间排列的记录
2.取出时间最前的一条
3.删除掉同一天内其他oid的记录
------------------


[解决办法]
CREATE TABLE T 

id int identity(1,1), 
old int, 
date datetime 



create proc porT
(
@old int, 
@date datetime 
)
as
IF NOT EXISTS ( SELECT * FROM T WHERE old=@old and CONVERT(DATETIME,left(date,11),110)=CONVERT(DATETIME,left(@date,11),110))
begin 
INSERT INTO T (old,date)
 VALUES (@old,@date) 
end
[解决办法]
shined wrote
开始新的生活

哪个性能更好些呢?
请考虑一下我说的那个联合约束问题

INSTEAD OF触发器中的语句体和直接在前台程序中要插数据时先 IF EXISTS 再 INSERT 相比,二者其实执行的一样.
只不过 INSTEAD触发器增加后,当系统执行插入操作时,需要先查找一些系统对象,比如找到这个触发器才执行触发, 中间实际多了一步,理论上有损耗,实际可呼略.

不过,还是建议使用INSTEAD触发器, 因为在程序的每个插入操作处都加个IF EXISTS不易维护. 当然将这个IF EXISTS操作封在存储过程里,前台调用存储过程来实现,也是可行的.

你使用创建约束的方法报错,是因为创建约束时不约许用函数吧. 就像 EXEC 一样.


[解决办法]
笨办法,再加一字段保存日期时间的日期部分,再对id与日期字段设为主键

或写一插入触发器

或在插入前先用语句直接检查,检查前开始事务,且查询时锁表( from 表名 with (holdlock)) , 插入记录后再提交事务

以上方法,如果可增加字段,加一字段保存日期应该是插入效率最快的.



[解决办法]
你把日期作一个字段,时间做一个字段,再把ID和时间作联合主键就行了,建触发器影响揷入的速度

热点排行
Bad Request.