SQL Server — существующие записи в INSERT, создающие действительно высокое значение автонумерации

Я понимаю, что поведение автоинкрементных полей идентификаторов изменилось в новейших версиях SQL Server. Я также понимаю, что «последовательное» поведение никогда не было гарантией для начала, но было приятно, что оно обычно демонстрировало поведение типа +1. 🙂

У меня есть приложение, которое пытается написать несколько записей довольно часто. SQL я бегу ниже. Я думал, что блок NOT EXISTS и TRY / CATCH предотвратит «попытку» уже существующей записи, предотвратив чрезвычайно высокое (и быстро растущее) поле идентификатора идентификатора, которое я использую. Пытался уберечь себя от необходимости сначала делать «SELECT», проверять результат, а затем делать INSERT, если он пустой (с использованием PHP). Я думал, что этот SQL сделает это для меня все сразу.

Я предполагаю, что моя настоящая обеспокоенность заключается в том, что при скорости, с которой растет мое числовое поле, это скоро станет проблемой. 🙂 Через 1 день это уже 90 000 000+ (это поле типа int).

Любые предложения по предотвращению этого?

IF (NOT EXISTS(SELECT
*
FROM
EventsTable
WHERE
EventType LIKE 'Alarm'
AND EventSource LIKE 'RackB, Circuit 4'
AND EventDescription LIKE 'Comm Timeout'
AND EventDateTime LIKE '08-05-2015 13:25:02'
AND EventLocation LIKE 'MT01')) BEGIN TRY INSERT
INTO
EventsTable
( EventDateTime, EventType, EventSource, EventDescription, EventSubSystemKey, EventViewKey, EventLocation, EventPriority )
VALUES
('08-05-2015 13:25:02','Alarm','RackB, Circuit 4','Comm Timeout','1','4','MT01','Notice')
END TRY BEGIN CATCH
END CATCH

1

Решение

Это может или не может быть верным ответом на вашу проблему, но это выскочило мне сразу:

 AND EventDateTime LIKE '08-05-2015 13:25:02'

Это всегда вернется false если твой EventDateTime поле действительно DATETIME тип. Поскольку это условие не может быть выполнено, NOT EXISTS всегда сообщит, что данных нет. Таким образом, вы всегда будете вставлять данные, независимо от того, действительно ли они существуют в базе данных или нет.

Вы должны изменить свой LIKE заявления должны быть =, Ни один из VARCHAR сравнения используют подстановочные знаки, и из того, что кажется, это ломает ваши DATETIME сравнения.

Редактировать:

Если вам нужно использовать LIKE с подстановочным знаком в этом утверждении, вам нужно будет разыграть EventDateTime столбец к VARCHAR за это. LIKE не предназначен для обработки DATETIME Тип данных (насколько я знаю), поэтому вам нужно сделать что-то вроде этого:

AND Convert(Varchar, EventDateTime, 121) LIKE '08-05-2015 13:25:02%'
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]