sql - INSERT IF NOT EXISTS 但以任何一种方式返回身份

标签 sql sql-server sql-server-2008-r2

我有 3 个表:audioFormats、videoFormats 和 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

关于sql - INSERT IF NOT EXISTS 但以任何一种方式返回身份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8030363/

相关文章:

java - 为什么 hibernate 在不同的 JVM 实例中为相同的查询创建不同的列别名?

SQL - 比较查询中的多行

sql-server-2008 - 在 SQL Server 2008 数据库上附加 SQL Server 2008 R2 mdf 文件

sql - 如何在 SQL 中处理 Unicode 替换字符 � (0xFFFD/65533)

MYSQL跨多个表选择+使用数学运算符 Average/Count

sql-server - 是否可以优化或重写此游标以获得最佳性能?

sql-server-2008-r2 - SQL Server 2008 R2 Express : Management Tools Missing from Feature Selection

mysql - 数据库设计,如何减少不同列的数据冗余

mysql - 从同一列获取信息并将其显示在多列上

使用自连接捕获数据的 SQL 查询