У меня есть этот SQL запрос обновления:Насколько безопасен этот запрос в SQL Server?
UPDATE table1
SET table1.field1 = 1
WHERE table1.id NOT IN (SELECT table2.table1id FROM table2);
Другие части приложения могут добавлять записи в table2, которые используют поле table1id ссылаться table1.
Целью здесь является удаление записей из таблицы1, на которые не ссылается таблица2.
SQL Server автоматически блокирует таблицу2 с таким типом запроса, чтобы новая запись не могла быть добавлена в таблицу2 при выполнении этого запроса?
Я также рассмотрел:
UPDATE table1
SET field1 = 1
WHERE 0 = (SELECT COUNT(*) FROM table2 WHERE table1.id = table2.table1id);
Который, кажется, возможно, безопаснее, но гораздо медленнее (потому что ВЫБРАТЬ будет называться на каждой строке table1 вместо только один выбор для NOT IN)
Вы используете транзакции? – Nate
Можете ли вы использовать встроенную ссылочную целостность и каскадные удаления? –
Каскадные удаления на самом деле не то, что мне нужно. Целью здесь является только обновление записей в таблице1, на которые не ссылается таблица2. Прежде чем вставить новую запись в таблицу2, она ищет таблицу 1 для соответствующей записи (где также поле1 <> 1), если она находит ее, она затем вставляет новую запись в таблицу2, ссылающуюся на таблицу1. Стол для блокировки2 на самом деле не вариант. – userx