update和delete区别的方法有几种 1,可以用 if update...来区别. 2,有无产生inserted逻辑表,或可访问,或有数据 3,原表中记录数(这个准确度较差)
表格有主键。时间是我自己瞎写的。应该按照时间升序排列。请问4楼如何用trigger实现。
--删除的记录 select distinct Record from 表 a where not exists (select 1 from 表 where Record=a.Record and Replaced is null)--更新过的记录 select distinct Record from 表 a where exists (select 1 from 表 where Record=a.Record and Replaced is null) and exists (select 1 from 表 where Record=a.Record and Replaced is not null)--没更新过的记录 select distinct Record from 表 a where not exists (select 1 from 表 where Record=a.Record and Replaced is not null)
随便写了个tb和oprateLog还有个trigger给你.可以看看后面的测试操作.查看tb表和log表 declare @t table(id int identity(1,1), v varchar(10)) insert @t select 'a' USE test GO CREATE TABLE tb(id INT IDENTITY(1,1),v VARCHAR(10)) GO CREATE TABLE oprateLog(lid INT IDENTITY(1,1),sourceID INT NOT NULL,createTime DATETIME NOT NULL DEFAULT GETDATE(),modifyOrDelTime DATETIME NULL,method TINYINT NOT NULL DEFAULT 0) GO CREATE TRIGGER testLog ON tb FOR INSERT,UPDATE,DELETE AS --INSERT IF EXISTS(SELECT 1 FROM INSERTED) AND NOT EXISTS(SELECT 1 FROM DELETED) INSERT oprateLog(sourceID) SELECT id FROM INSERTED --UPDATE IF UPDATE(v) UPDATE o SET modifyOrDelTime=GETDATE(),method=1 FROM oprateLog o INNER JOIN deleted d ON id=sourceid --DELETE IF EXISTS(SELECT 1 FROM DELETED) AND NOT EXISTS(SELECT 1 FROM INSERTED) UPDATE o SET modifyOrDelTime=GETDATE(),method=2 FROM oprateLog o INNER JOIN deleted d ON id=sourceid GO--TRUNCATE TABLE tb --TRUNCATE TABLE oprateLog INSERT tb SELECT 'a' INSERT tb SELECT 'b' SELECT * FROM oprateLog UPDATE tb SET v='x' WHERE id=1 SELECT * FROM oprateLog DELETE FROM tb WHERE id=2 INSERT tb SELECT 'c' SELECT * FROM oprateLog SELECT * FROM tb GO
小楼在3楼问楼主的是他的log表怎么来区分delete和update吧, 我理解错了,不好意思.
这么快有这么多回复。都是SQL高手啊。我虽然自己很欣赏fcuandy的方法,简单易行。但是如果表很大,而且结构一直要改动,有时候就不能保证所有记录都准确无误地记录下来。当然任何方法都不能做到完全准确。Limpire的办法比较可行: --删除的记录 select distinct Record from 表 a where not exists (select 1 from 表 where Record=a.Record and Replaced is null
可以用trigger实现.
但有前提, 你的数据表中要有主健.
oprateLog表中要有列关联到你的数据表的主健列. 也不一定是非要建关联关系, 但一定要进行这样的关联设计,否则按你现在的结构没法实现.不知道我有没有理解你的意思.
1,可以用 if update...来区别.
2,有无产生inserted逻辑表,或可访问,或有数据
3,原表中记录数(这个准确度较差)
select distinct Record from 表 a
where not exists (select 1 from 表 where Record=a.Record and Replaced is null)--更新过的记录
select distinct Record from 表 a
where exists (select 1 from 表 where Record=a.Record and Replaced is null)
and exists (select 1 from 表 where Record=a.Record and Replaced is not null)--没更新过的记录
select distinct Record from 表 a
where not exists (select 1 from 表 where Record=a.Record and Replaced is not null)
declare @t table(id int identity(1,1), v varchar(10))
insert @t select 'a'
USE test
GO
CREATE TABLE tb(id INT IDENTITY(1,1),v VARCHAR(10))
GO
CREATE TABLE oprateLog(lid INT IDENTITY(1,1),sourceID INT NOT NULL,createTime DATETIME NOT NULL DEFAULT GETDATE(),modifyOrDelTime DATETIME NULL,method TINYINT NOT NULL DEFAULT 0)
GO
CREATE TRIGGER testLog ON tb
FOR INSERT,UPDATE,DELETE
AS
--INSERT
IF EXISTS(SELECT 1 FROM INSERTED) AND NOT EXISTS(SELECT 1 FROM DELETED)
INSERT oprateLog(sourceID) SELECT id FROM INSERTED
--UPDATE
IF UPDATE(v)
UPDATE o SET modifyOrDelTime=GETDATE(),method=1
FROM oprateLog o
INNER JOIN deleted d
ON id=sourceid
--DELETE
IF EXISTS(SELECT 1 FROM DELETED) AND NOT EXISTS(SELECT 1 FROM INSERTED)
UPDATE o SET modifyOrDelTime=GETDATE(),method=2
FROM oprateLog o
INNER JOIN deleted d
ON id=sourceid
GO--TRUNCATE TABLE tb
--TRUNCATE TABLE oprateLog
INSERT tb SELECT 'a'
INSERT tb SELECT 'b'
SELECT * FROM oprateLog
UPDATE tb SET v='x' WHERE id=1
SELECT * FROM oprateLog
DELETE FROM tb WHERE id=2
INSERT tb SELECT 'c'
SELECT * FROM oprateLog
SELECT * FROM tb
GO
--删除的记录
select distinct Record from 表 a
where not exists (select 1 from 表 where Record=a.Record and Replaced is null
刚才进一步测试,全部通过。太感激了。加Method column是一个好方法。要不是现在的设计已经定了下来,我们会认真考虑。毕竟SQL要简单很多啊。既然现在所有问题已经解决,虽然增加了一些SQL工作量,这样的设计表结构可以做到最简单,还是不错的一个方案。好像这个帖子介绍3种方法了,不错哦。用trigger和Log表的方法,我以前用过,到现在还是认为有明显的优点。所以我都会加分。呵呵。