日期:2014-05-18  浏览次数:20447 次

请教如何避免重复记录的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 一样.