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