回答

收藏

如果不存在则插入,但以任何一种方式返回标识

技术问答 技术问答 256 人阅读 | 0 人回复 | 2023-09-14

我有3个表:audioFormats,videoFormats和fileInfo。我有一个事务,当我插入到fileInfo表中时,该插入包含来自audioFormats和videoFormats的FK。如果这些表中还没有音频或视频格式,则会在后面的表中进行插入,然后将生成的(或现有的)ID值插入到fileInfo中。
" `- L7 z; c& ~$ d仅当该值不存在时如何有效地插入该值,而仅使用SQL(可能是一个事务)获取该值的ID是否已存在或是否刚刚插入。
5 Z7 L/ H, g" O' K  a我可以插入一个不存在的值:7 V, [) f6 {( p$ L6 a
INSERT INTO audioformats (audioformat)
! f2 d  U/ M) |$ _# WVALUES(@format)
6 u. g" ]5 y) w( l6 i* C. |6 TWHERE NOT EXISTS (SELECT 1 FROM audioformats WHERE audioformat = @format)& `3 _' R9 _: j7 _: \# w
我可以从插入中获取插入的ID:
; ~. \: |; H6 m) F- DINSERT INTO audioFormats (audioFormat)$ |  B# y. R$ h, Y/ s
VALUES ('Test')
1 m- }0 _/ h7 H# K% b  x* m/ ASET @audioFormatId = SCOPE_IDENTITY()
- u. @" R4 _6 M8 w% d1 e如果没有插入,SCOPE_IDENTITY不会给我一个ID值。我可以执行标量查询以在可能的插入之后获取身份,但是看来我应该最多可以使用一个SELECT和INSERT来完成所有这些工作。1 x8 F4 u0 f  ]. L2 Z. T
               
& I( h3 e3 _2 p! a: i# b解决方案:; z- x" C! X+ u- j" j& c
               
% r  E# `9 T  K& H; D! M: k' x; Y: x8 W! [1 a( |, p
# i  Z5 q7 s& ^# {& a3 E, \( q8 C
                您可以使用IF语句执行此操作, a* c/ I) \$ O  ^1 V" @# z; w
IF NOT EXISTS(SELECT TOP 1 1 FROM audioformats WHERE audioformat = @format)
3 K/ [4 c" A! P! P" a, O: N, oBEGIN. w. j+ [3 s" E3 |) M. V$ d
  INSERT INTO audioFormats (audioFormat)+ B# Y7 s6 J7 @6 P% ^
  VALUES ('Test')
' _( b3 ^; x8 k2 W  SET @audioFormatId = SCOPE_IDENTITY()
- j# o: L) r- dEND
# Q6 G& T+ T5 Q& b- A" @2 X6 aELSE/ `8 d' k3 X3 W3 l4 y7 j4 q
BEGIN2 ?8 G8 K9 N( o7 ]' A/ B
  SELECT @audioFormatID = ID FROM audioformats WHERE audioformat = @format
( Z5 s2 }7 }. w/ @6 k+ c) F  _END
7 j, U# Y1 A+ K4 A( p# L或者你可以这样:' s& W* [* }2 \4 D/ h
INSERT INTO audioformats (audioformat)
; f3 i. |% a  i4 z. v  J  SELECT @format
: h9 T4 {! @+ r; F! [4 P( f4 @' G  FROM audioFormats/ ]& Y5 ?4 g* Q. R" p" j- M2 H3 u2 ]
  WHERE NOT EXISTS (SELECT TOP 1 1 FROM audioformats WHERE audioformat = @format)6 M9 _. z+ t5 ]( J% i
SELECT @audioFormatID = ID FROM audioformats WHERE audioformat = @format
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则