IF NOT EXISTS语句中的SQL操作次数与SQL服务器引擎中的主键检查[重复]。

问题描述 投票:0回答:1

考虑一个表格 A 的主键,列1,列2。

现在让 column1 是主键,它的类型是 uniqueidentifier.

现在,如果你想避免使用存储过程重复插入表,哪种方法更好?

情况#1:

IF NOT EXISTS (SELECT 1 FROM TABLE A WHERE column1 = @insertValue)
BEGIN
    INSERT INTO Table A
     ....
END

还是情况#2:

TRY
BEGIN
    INSERT INTO TABLE A
END
CATCH
BEGIN
    IF(ErrorNumber() = 2627)--Erro number of primary key violation
    BEGIN
        ---------- deal with the error
    END
END

我觉得情况#2更好,因为只有一次SQL检查操作, 但在情况#1中,它发生了两次。

我知道我们在表上创建主键时,SQL会在插入前检查重复,使用SQL检查重复的这种现有机制是不是很好,而不是使用IF NOT EXISTS。

请补充说明你的答案,请考虑所有参数,深入解释答案

各位请帮我从sql对表的操作方面理解。这里的目的是想了解sql主键违规检查的内部机制。

sql-server database sql-server-2008 database-design primary-key
1个回答
1
投票

你可以在应用数据修改时使用下面的块。

SET XACT_ABORT, NOCOUNT ON;

BEGIN TRY

    BEGIN TRANSACTION;
    -- CODE BLOCK GOES HERE
    COMMIT TRANSACTION;

END TRY
BEGIN CATCH 

   IF @@TRANCOUNT > 0
   BEGIN
      ROLLBACK TRANSACTION
   END;

   -- GET ERRORS DETAILS OR THROW ERROR

END CATCH;

SET XACT_ABORT, NOCOUNT OFF;

此外,如果你的主键是 UNIQUEIDENTIFER 而你在生成新的值时使用 NEWID() 功能,你可以冷静---------------------------------。CATCH 块将不会被执行。

但是,使用这样的值,如 primary key 是不好的,因为。

  • 它比(smallint, int, bigint)这样的数字类型占用更多的空间。
  • 万一 NEWID() 的情况下,它们将被插入到您的索引的随机页面中,这将导致碎片化;如果使用 IDENTITY 列,新的行会被插入到最后一页;虽然你可以通过使用 NEWSEQUENTIALID
© www.soinside.com 2019 - 2024. All rights reserved.