Анонимный пользователь
Дополнительно
Проверить, существует ли строка, в противном случае вставить
Мне нужно написать Т-SQL хранимой процедуры, которая обновляет строку в таблице. Если строки Не'т существуют, вставьте его. Все это шаги обернутый сделки.
Это системы бронирования, поэтому оно должно быть атомная и надежный. Она должна возвращать true, если транзакция была совершена и забронированный рейс.
Я'м новый в T-SQL В, и не знаете, как использовать функции@@rowcount`. Это то, что я'вэ написано до сих пор. Я на правильном пути? Я'м уверена, что это легкая задача для вас.
-- BEGIN TRANSACTION (HOW TO DO?)
UPDATE Bookings
SET TicketsBooked = TicketsBooked + @TicketsToBook
WHERE FlightId = @Id AND TicketsMax < (TicketsBooked + @TicketsToBook)
-- Here I need to insert only if the row doesn't exists.
-- If the row exists but the condition TicketsMax is violated, I must not insert
-- the row and return FALSE
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO Bookings ... (omitted)
END
-- END TRANSACTION (HOW TO DO?)
-- Return TRUE (How to do?)
225
11
Взгляните на слияние команда. Вы можете сделать
обновление
,вставить
&удалить
в одном заявлении.Вот рабочая реализация на использовании "объединить"
если существует(выберите 1 из базы данных information_schema.ТАБЛИЦЫ Т где Т. ИМЯ_ТАБЛИЦЫ = 'заказы') начать падение заказов стол конец Перейти
создайте заказа столиков( FlightID инт идентичности(1, 1) первичного ключа, TicketsMax инт не null, TicketsBooked инт не null ) Перейти
вставка заказы(TicketsMax, TicketsBooked) выберите 1, 0 вставка заказы(TicketsMax, TicketsBooked) выберите 2, 2 вставка заказы(TicketsMax, TicketsBooked) выберите 3, 1 Перейти
выбрать * из заказа
И потом ...
Я предполагаю одну строку для каждого рейса? Если так:
Я предполагаю, что я сказал, А ваш способ делать вещи могут перебронировали на рейс, так как он будет вставлять новую строку, когда есть 10 билетов максимум и вы бронируете 20.
Пройти updlock, уключины, аргумент holdlock подсказки при проверке на наличие строки.
в <предварительно><код>начать Тран / по умолчанию уровень изоляции чтения зафиксированных в порядке /
если не существует (выберите от стола с (updlock, уключины, аргумент holdlock), где ...) / вставить / еще / обновление */
фиксации / замки выпускаются здесь / </код></пре>
Подсказку updlock сил запрос взять блокировку обновления на строку, если она уже существует, не давая другим транзакциям изменять его до фиксации или отката.
Этот аргумент holdlock намек заставляет запроса блокировки диапазона, предотвращая другие операции добавления строки, соответствующей вашим критериям фильтра до фиксации или отката.
Уключины намека сил детализации блокировок строк, а не по умолчанию на уровне страницы, так что ваши сделки выиграл'т блокировать другие транзакции пытаются обновить независимые строки на той же странице (но помните о компромиссе между уменьшение конкуренции и увеличение в замок над головой - вам следует избегать приема большого количества блокировку на уровне строк в одной транзакции).
См http://msdn.microsoft.com/en-us/library/ms187373.aspx для получения дополнительной информации.
Обратите внимание, что замки берутся в качестве заявления, что принимать их будут казнить вызывая начать Тран не'т дать вам иммунитет против другой транзакцией щипать замки на что-то, прежде чем добраться до него. Вы должны попробовать и фактор своего SQL, чтобы держать замки в кратчайшие сроки путем совершения сделки как можно скорее (приобретать начале конце, релизе).
Обратите внимание, что блокировки на уровне строк может быть менее эффективным, если ваш ПК имеет тип bigint, как внутреннего хеширования на SQL Server-это дегенеративное для 64-разрядных значений (различных основных значения хэш один и тот же идентификатор блокировки).
я'м пишу мое решение. мой метод не'т стоять 'если бы' или 'слияние'. мой метод прост.
Например:
Объяснение:
(1) Выберите столбец col1,столбец col2 from Имя_таблицы где col1=@парам1 и col2=@парам2 Он выбирает из таблицы искали ценности
(2) Выберите @парам1, @парам2, где не существует Это нужно, если не существует из (1) подзапрос
(3) вставки в tableName (2) шаг значений
Я, наконец, смог вставить строку, при условии, что это не'т уже существуют, используя следующую модель:
который я нашел по адресу:
http://www.postgresql.org/message-id/87hdow4ld1.fsf@stark.xeocode.com
Это я просто недавно пришлось делать:
Вы можете использовать слияние функциональные возможности для достижения. В противном случае вы можете сделать:
Полное решение ниже (включая структуру курсора). Большое спасибо Поркус Кассия для начала транс ... обязательства` код из постинга выше.
Лучший подход к этой проблеме является первым создание уникального столбца базы данных
Инструкции ALTER TABLE имя_таблицы добавить уникальный ключ
Затем вставить игнорировать в имя_таблицы` ,значение выиграл'т быть вставлен, если он приводит к дублировать ключ уже существует в таблице.