考虑一个表格 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主键违规检查的内部机制。
你可以在应用数据修改时使用下面的块。
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
是不好的,因为。
NEWID()
的情况下,它们将被插入到您的索引的随机页面中,这将导致碎片化;如果使用 IDENTITY
列,新的行会被插入到最后一页;虽然你可以通过使用 NEWSEQUENTIALID