我有3个表:audioFormats,videoFormats和fileInfo.
我有一个事务,当我插入到fileInfo表中,该插入包括来自audioFormats和videoFormats的FK.如果音频格式或视频格式不在这些表中,则将后面的表插入,然后将生成的(或现有的)ID值插入到fileInfo中.
我有一个事务,当我插入到fileInfo表中,该插入包括来自audioFormats和videoFormats的FK.如果音频格式或视频格式不在这些表中,则将后面的表插入,然后将生成的(或现有的)ID值插入到fileInfo中.
只有在该值不存在时才能高效地插入值,而是获取该值的ID是否已经存在,或者仅使用sql(也可能是一个事务)新插入的值.
如果不存在,我可以插入一个值:
INSERT INTO audioformats (audioformat) VALUES(@format) WHERE NOT EXISTS (SELECT 1 FROM audioformats WHERE audioformat = @format)
我可以从插入中获取插入的ID:
INSERT INTO audioFormats (audioFormat) VALUES ('Test') SET @audioFormatId = SCOPE_IDENTITY()
如果没有插入,SCOPE_IDENTITY不会给我一个ID值.
我可以执行一个标量查询以获取可能的插入后的身份,但似乎我应该能够做到这一切与最多一个SELECT和INSERT.
解决方法
您可以使用IF语句来执行此操作
IF NOT EXISTS(SELECT TOP 1 1 FROM audioformats WHERE audioformat = @format) BEGIN INSERT INTO audioFormats (audioFormat) VALUES ('Test') SET @audioFormatId = SCOPE_IDENTITY() END ELSE BEGIN SELECT @audioFormatID = ID FROM audioformats WHERE audioformat = @format END
或者你可以这样做:
INSERT INTO audioformats (audioformat) SELECT @format FROM audioFormats WHERE NOT EXISTS (SELECT TOP 1 1 FROM audioformats WHERE audioformat = @format) SELECT @audioFormatID = ID FROM audioformats WHERE audioformat = @format