零件号 零件名 零件规格 所属设备号
我的零件号不是固定的,是动态生成的,所以我要用零件名,零件规格,所属设备号三个字段一起来确定某个零件在数据表中是否存在
。也就是说,如果零件名,零件规格,所属设备号三个字段都相同,就是指的是一个零件了。
我求的触发器是要判断插入的零件记录在表里是否已经存在。
19 个解决方案
#1
最好用一个自增的ID字段做唯一标识
#2
alter table tablename add constraint consname unique (零件名,零件规格,所属设备号)
这样建个唯一性约束比较好
这样建个唯一性约束比较好
#3
同意樓上的,建一約束最好:
在觸發器中:
declare @A,@B,@C varchar(100)
select @A=零件名,@B=零件规格,@C=所属设备
from inserted
if exists(select 1 from 你的表 where 零件名=@A and 零件规格=@B and 所属设备号 =@C
rollback
...
在觸發器中:
declare @A,@B,@C varchar(100)
select @A=零件名,@B=零件规格,@C=所属设备
from inserted
if exists(select 1 from 你的表 where 零件名=@A and 零件规格=@B and 所属设备号 =@C
rollback
...
#4
create trigger tr_insert on 表
for insert
as
if exists(select 1 from 表 group by 零件号,零件规格,所属设备号 having count(*)>1)
begin
RAISERROR('不能插入重复记录',16,1)
rollback tran
end
go
for insert
as
if exists(select 1 from 表 group by 零件号,零件规格,所属设备号 having count(*)>1)
begin
RAISERROR('不能插入重复记录',16,1)
rollback tran
end
go
#5
以上方法當inserted表有多條記錄時要循環提取判斷。
#6
--建议的方法是在: 零件号,零件规格,所属设备号
--上建立一个唯一约束,而不是写触发器.
--建立约束的语句:
create UNIQUE index 约束名 on 表(零件号,零件规格,所属设备号 )
--上建立一个唯一约束,而不是写触发器.
--建立约束的语句:
create UNIQUE index 约束名 on 表(零件号,零件规格,所属设备号 )
#7
--我的触发器已经考虑了同时处理多条记录的情况.
#8
我的第一个字段零件号是关键字段。
但是零件号不是人为输入的,是自动生成的,但不是自增ID
比如现在手头的EXCEL里面只有零件名,零件规格,所属设备号。不因为零件号很长,也不便记忆,直接从EXCEL能取的字段就只有零件名,零件规格,所属设备号三个字段了。因为没有关键字段,所以没有直接提交到数据库中,而是放缓存区。然后才循环依次生成每条记录的关键字段--零件号。而零件号是由系统自动根据日期,所属设备号一起决定而生成的。在缓存中的记录的关键字--零件号生成以后才整体提交到数据库。因为零件号是系统内部生成的,所以往数据库再插入新的数据时就没办法用零件号来判断将要插入的新数据是否会关键字冲突了。
请大家指点迷津
但是零件号不是人为输入的,是自动生成的,但不是自增ID
比如现在手头的EXCEL里面只有零件名,零件规格,所属设备号。不因为零件号很长,也不便记忆,直接从EXCEL能取的字段就只有零件名,零件规格,所属设备号三个字段了。因为没有关键字段,所以没有直接提交到数据库中,而是放缓存区。然后才循环依次生成每条记录的关键字段--零件号。而零件号是由系统自动根据日期,所属设备号一起决定而生成的。在缓存中的记录的关键字--零件号生成以后才整体提交到数据库。因为零件号是系统内部生成的,所以往数据库再插入新的数据时就没办法用零件号来判断将要插入的新数据是否会关键字冲突了。
请大家指点迷津
#9
那用触发器或唯一索引没有什么问题啊.
#10
--我的触发器写错一个字段:
create trigger tr_insert on 表
for insert
as
if exists(select 1 from 表 group by 零件名,零件规格,所属设备号 having count(*)>1)
begin
RAISERROR('不能插入重复记录',16,1)
rollback tran
end
go
create trigger tr_insert on 表
for insert
as
if exists(select 1 from 表 group by 零件名,零件规格,所属设备号 having count(*)>1)
begin
RAISERROR('不能插入重复记录',16,1)
rollback tran
end
go
#11
--对应的,如果用约束,也要改一下:
create UNIQUE index 约束名 on 表(零件名,零件规格,所属设备号 )
create UNIQUE index 约束名 on 表(零件名,零件规格,所属设备号 )
#12
--如果你的零件号是自动生成的,而且零件号的默认值已经足以取得零件号的话
--可以这样写插入语句
insert 表(零件名,零件规格,所属设备号) --假设零件号可以在插入记录时自动生成
select a.零件名,a.零件规格,a.所属设备号
from 临时表 a left join 表 b on a.零件名=b.零件名 and a.零件规格=b.零件规格 and a.所属设备号=b.所属设备号
where b.零件名 is null
--可以这样写插入语句
insert 表(零件名,零件规格,所属设备号) --假设零件号可以在插入记录时自动生成
select a.零件名,a.零件规格,a.所属设备号
from 临时表 a left join 表 b on a.零件名=b.零件名 and a.零件规格=b.零件规格 and a.所属设备号=b.所属设备号
where b.零件名 is null
#13
建立唯一约束與建觸發器都能處理你的需求,但用觸發器會更影響性能。
#14
因为如上我所说的,那么自动生成的零件号是不可能出现重复的情况的。
比如我第一次从EXCEL里面取了3行记录。又零件号自动生成,那么这三个自动生成的零件号是20040101,20040102,20040103。零件号生成就自动提交到数据库了。
如果我不小心下次打开的还是同一个EXCEL文件,因为系统是到数据库里面找到零件号字段中的最大值MAX(零件号),然后让MAX(L零件号)自动加一形成零件号,这样的话,根本就不会出现零件号相同的情况,也就不会关键字冲突了。但数据库里面却有了零件名,零件规格,所属设备三个字段都一样的记录。但这在实际情况中,是重复的数据啊。
所以我才要用零件名,零件规格,所属设备三个字段共同决定数据是否重复。
比如我第一次从EXCEL里面取了3行记录。又零件号自动生成,那么这三个自动生成的零件号是20040101,20040102,20040103。零件号生成就自动提交到数据库了。
如果我不小心下次打开的还是同一个EXCEL文件,因为系统是到数据库里面找到零件号字段中的最大值MAX(零件号),然后让MAX(L零件号)自动加一形成零件号,这样的话,根本就不会出现零件号相同的情况,也就不会关键字冲突了。但数据库里面却有了零件名,零件规格,所属设备三个字段都一样的记录。但这在实际情况中,是重复的数据啊。
所以我才要用零件名,零件规格,所属设备三个字段共同决定数据是否重复。
#15
--你建立这样一个约束.
create UNIQUE index 约束名 on 表(零件名,零件规格,所属设备号 )
如果你插入的记录的
零件名,零件规格,所属设备
与表中现有记录的:
零件名,零件规格,所属设备
相同,就根本不能插入,所以你说的情况也就解决了.
create UNIQUE index 约束名 on 表(零件名,零件规格,所属设备号 )
如果你插入的记录的
零件名,零件规格,所属设备
与表中现有记录的:
零件名,零件规格,所属设备
相同,就根本不能插入,所以你说的情况也就解决了.
#16
能给出具体实现步骤吗
#17
--没有什么步骤啊,就是在查询分析器中执行下面的语句,创建一个唯一约束
create UNIQUE index 约束名 on 表(零件名,零件规格,所属设备号 )
以后你往表中插入记录的时候,系统会自动检查,如果有重复,就报错,不给插入.
create UNIQUE index 约束名 on 表(零件名,零件规格,所属设备号 )
以后你往表中插入记录的时候,系统会自动检查,如果有重复,就报错,不给插入.
#18
创建了这样的约束,如果下次我要修改某个零件规格,会不会受到影响呢
#19
揭贴啦!
#20
#1
最好用一个自增的ID字段做唯一标识
#2
alter table tablename add constraint consname unique (零件名,零件规格,所属设备号)
这样建个唯一性约束比较好
这样建个唯一性约束比较好
#3
同意樓上的,建一約束最好:
在觸發器中:
declare @A,@B,@C varchar(100)
select @A=零件名,@B=零件规格,@C=所属设备
from inserted
if exists(select 1 from 你的表 where 零件名=@A and 零件规格=@B and 所属设备号 =@C
rollback
...
在觸發器中:
declare @A,@B,@C varchar(100)
select @A=零件名,@B=零件规格,@C=所属设备
from inserted
if exists(select 1 from 你的表 where 零件名=@A and 零件规格=@B and 所属设备号 =@C
rollback
...
#4
create trigger tr_insert on 表
for insert
as
if exists(select 1 from 表 group by 零件号,零件规格,所属设备号 having count(*)>1)
begin
RAISERROR('不能插入重复记录',16,1)
rollback tran
end
go
for insert
as
if exists(select 1 from 表 group by 零件号,零件规格,所属设备号 having count(*)>1)
begin
RAISERROR('不能插入重复记录',16,1)
rollback tran
end
go
#5
以上方法當inserted表有多條記錄時要循環提取判斷。
#6
--建议的方法是在: 零件号,零件规格,所属设备号
--上建立一个唯一约束,而不是写触发器.
--建立约束的语句:
create UNIQUE index 约束名 on 表(零件号,零件规格,所属设备号 )
--上建立一个唯一约束,而不是写触发器.
--建立约束的语句:
create UNIQUE index 约束名 on 表(零件号,零件规格,所属设备号 )
#7
--我的触发器已经考虑了同时处理多条记录的情况.
#8
我的第一个字段零件号是关键字段。
但是零件号不是人为输入的,是自动生成的,但不是自增ID
比如现在手头的EXCEL里面只有零件名,零件规格,所属设备号。不因为零件号很长,也不便记忆,直接从EXCEL能取的字段就只有零件名,零件规格,所属设备号三个字段了。因为没有关键字段,所以没有直接提交到数据库中,而是放缓存区。然后才循环依次生成每条记录的关键字段--零件号。而零件号是由系统自动根据日期,所属设备号一起决定而生成的。在缓存中的记录的关键字--零件号生成以后才整体提交到数据库。因为零件号是系统内部生成的,所以往数据库再插入新的数据时就没办法用零件号来判断将要插入的新数据是否会关键字冲突了。
请大家指点迷津
但是零件号不是人为输入的,是自动生成的,但不是自增ID
比如现在手头的EXCEL里面只有零件名,零件规格,所属设备号。不因为零件号很长,也不便记忆,直接从EXCEL能取的字段就只有零件名,零件规格,所属设备号三个字段了。因为没有关键字段,所以没有直接提交到数据库中,而是放缓存区。然后才循环依次生成每条记录的关键字段--零件号。而零件号是由系统自动根据日期,所属设备号一起决定而生成的。在缓存中的记录的关键字--零件号生成以后才整体提交到数据库。因为零件号是系统内部生成的,所以往数据库再插入新的数据时就没办法用零件号来判断将要插入的新数据是否会关键字冲突了。
请大家指点迷津
#9
那用触发器或唯一索引没有什么问题啊.
#10
--我的触发器写错一个字段:
create trigger tr_insert on 表
for insert
as
if exists(select 1 from 表 group by 零件名,零件规格,所属设备号 having count(*)>1)
begin
RAISERROR('不能插入重复记录',16,1)
rollback tran
end
go
create trigger tr_insert on 表
for insert
as
if exists(select 1 from 表 group by 零件名,零件规格,所属设备号 having count(*)>1)
begin
RAISERROR('不能插入重复记录',16,1)
rollback tran
end
go
#11
--对应的,如果用约束,也要改一下:
create UNIQUE index 约束名 on 表(零件名,零件规格,所属设备号 )
create UNIQUE index 约束名 on 表(零件名,零件规格,所属设备号 )
#12
--如果你的零件号是自动生成的,而且零件号的默认值已经足以取得零件号的话
--可以这样写插入语句
insert 表(零件名,零件规格,所属设备号) --假设零件号可以在插入记录时自动生成
select a.零件名,a.零件规格,a.所属设备号
from 临时表 a left join 表 b on a.零件名=b.零件名 and a.零件规格=b.零件规格 and a.所属设备号=b.所属设备号
where b.零件名 is null
--可以这样写插入语句
insert 表(零件名,零件规格,所属设备号) --假设零件号可以在插入记录时自动生成
select a.零件名,a.零件规格,a.所属设备号
from 临时表 a left join 表 b on a.零件名=b.零件名 and a.零件规格=b.零件规格 and a.所属设备号=b.所属设备号
where b.零件名 is null
#13
建立唯一约束與建觸發器都能處理你的需求,但用觸發器會更影響性能。
#14
因为如上我所说的,那么自动生成的零件号是不可能出现重复的情况的。
比如我第一次从EXCEL里面取了3行记录。又零件号自动生成,那么这三个自动生成的零件号是20040101,20040102,20040103。零件号生成就自动提交到数据库了。
如果我不小心下次打开的还是同一个EXCEL文件,因为系统是到数据库里面找到零件号字段中的最大值MAX(零件号),然后让MAX(L零件号)自动加一形成零件号,这样的话,根本就不会出现零件号相同的情况,也就不会关键字冲突了。但数据库里面却有了零件名,零件规格,所属设备三个字段都一样的记录。但这在实际情况中,是重复的数据啊。
所以我才要用零件名,零件规格,所属设备三个字段共同决定数据是否重复。
比如我第一次从EXCEL里面取了3行记录。又零件号自动生成,那么这三个自动生成的零件号是20040101,20040102,20040103。零件号生成就自动提交到数据库了。
如果我不小心下次打开的还是同一个EXCEL文件,因为系统是到数据库里面找到零件号字段中的最大值MAX(零件号),然后让MAX(L零件号)自动加一形成零件号,这样的话,根本就不会出现零件号相同的情况,也就不会关键字冲突了。但数据库里面却有了零件名,零件规格,所属设备三个字段都一样的记录。但这在实际情况中,是重复的数据啊。
所以我才要用零件名,零件规格,所属设备三个字段共同决定数据是否重复。
#15
--你建立这样一个约束.
create UNIQUE index 约束名 on 表(零件名,零件规格,所属设备号 )
如果你插入的记录的
零件名,零件规格,所属设备
与表中现有记录的:
零件名,零件规格,所属设备
相同,就根本不能插入,所以你说的情况也就解决了.
create UNIQUE index 约束名 on 表(零件名,零件规格,所属设备号 )
如果你插入的记录的
零件名,零件规格,所属设备
与表中现有记录的:
零件名,零件规格,所属设备
相同,就根本不能插入,所以你说的情况也就解决了.
#16
能给出具体实现步骤吗
#17
--没有什么步骤啊,就是在查询分析器中执行下面的语句,创建一个唯一约束
create UNIQUE index 约束名 on 表(零件名,零件规格,所属设备号 )
以后你往表中插入记录的时候,系统会自动检查,如果有重复,就报错,不给插入.
create UNIQUE index 约束名 on 表(零件名,零件规格,所属设备号 )
以后你往表中插入记录的时候,系统会自动检查,如果有重复,就报错,不给插入.
#18
创建了这样的约束,如果下次我要修改某个零件规格,会不会受到影响呢
#19
揭贴啦!