Как обновить две таблицы в одном из операторов SQL Server 2005?
Я хочу обновить две таблицы за один раз. Как мне это сделать в SQL Server 2005?
UPDATE
Table1,
Table2
SET
Table1.LastName='DR. XXXXXX',
Table2.WAprrs='start,stop'
FROM
Table1 T1,
Table2 T2
WHERE
T1.id = T2.id
AND
T1.id = '010008'
Ответы
Ответ 1
Вы не можете обновлять несколько таблиц в одном из операторов, однако вы можете использовать транзакцию, чтобы убедиться, что два оператора UPDATE
обрабатываются атомарно. Вы также можете их выгружать, чтобы избежать кругового путешествия.
BEGIN TRANSACTION;
UPDATE Table1
SET Table1.LastName = 'DR. XXXXXX'
FROM Table1 T1, Table2 T2
WHERE T1.id = T2.id
and T1.id = '011008';
UPDATE Table2
SET Table2.WAprrs = 'start,stop'
FROM Table1 T1, Table2 T2
WHERE T1.id = T2.id
and T1.id = '011008';
COMMIT;
Ответ 2
Вы не можете обновлять сразу две таблицы, но вы можете связать обновление со вставкой с помощью OUTPUT INTO, и вы можете использовать этот вывод в качестве соединения для второго обновления:
DECLARE @ids TABLE (id int);
BEGIN TRANSACTION
UPDATE Table1
SET Table1.LastName = 'DR. XXXXXX'
OUTPUT INSERTED.id INTO @ids
WHERE T1.field = '010008';
UPDATE Table2
SET Table2.WAprrs = 'start,stop'
FROM Table2
JOIN @ids i on i.id = Table2.id;
COMMIT;
Я изменил пример вашего условия WHERE, чтобы быть каким-то другим полем, чем id, если id, вам не нужен этот причудливый OUTPUT, вы можете просто ОБНОВИТЬ вторую таблицу для того же id = '010008'.
Ответ 3
Извините, афайк, вы не можете этого сделать. Чтобы обновить атрибуты в двух разных таблицах, вам нужно будет выполнить два отдельных оператора. Но они могут быть в пакете (набор SQL, отправленный на сервер за один раз)
Ответ 4
Короткий ответ на этот вопрос - нет. Хотя вы можете ввести несколько таблиц в предложение from
оператора обновления, вы можете указать только одну таблицу после ключевого слова update
. Даже если вы пишете "обновляемый" вид (который представляет собой просто представление, которое следует определенным ограничениям), такие обновления будут неудачными. Вот соответствующие клипы из документации MSDN (акцент мой).
UPDATE (Transact-SQL)
Реле, на которое ссылается table_or_view_name, должно быть обновляемым и ссылаться на одну базовую таблицу в предложении FROM представления. Дополнительные сведения об обновляемых представлениях см. В разделе CREATE VIEW (Transact-SQL).
CREATE VIEW (Transact-SQL)
Вы можете изменить данные базовой таблицы с помощью представления, если выполняются следующие условия:
- Любые изменения, включая инструкции UPDATE, INSERT и DELETE, должны ссылаться на столбцы из только одной базовой таблицы.
- Столбцы, которые изменяются в представлении, должны напрямую ссылаться на базовые данные в столбцах таблицы. Столбцы не могут быть выведены никаким другим способом, например, через следующее:
- Агрегатная функция: AVG, COUNT, SUM, MIN, MAX, GROUPING, STDEV, STDEVP, VAR и VARP.
- Вычисление. Столбец не может быть вычислен из выражения, которое использует другие столбцы. Столбцы, которые формируются с использованием заданных операторов UNION, UNION ALL, CROSSJOIN, EXCEPT и INTERSECT, вычисляются и также не могут обновляться.
- Измененные столбцы не зависят от предложений GROUP BY, HAVING или DISTINCT.
- TOP не используется нигде в select_statement представления вместе с предложением WITH CHECK OPTION.
Однако, честно говоря, вам следует рассмотреть возможность использования двух разных операторов SQL в транзакции в соответствии с примером LBushkin.
UPDATE: Мое первоначальное утверждение о том, что вы можете обновлять несколько таблиц в обновляемом представлении, было неправильным. В SQL Server 2005 и 2012 он будет генерировать следующую ошибку. Я исправил свой ответ, чтобы отразить это.
Msg 4405, Level 16, State 1, Line 1
View or function 'updatable_view' is not updatable because the modification affects multiple base tables.
Ответ 5
Вы должны поместить в транзакцию два оператора обновления
Ответ 6
Это работает для MySQL и на самом деле является просто неявной транзакцией, но должно выглядеть примерно так:
UPDATE Table1 t1, Table2 t2 SET
t2.field = t2.field+2,
t1.field = t1.field+2
WHERE t1.id = t2.foreign_id and t2.id = '123414'
если вы делаете обновления для нескольких таблиц, для которых требуются несколько операторов... что, вероятно, возможно, если вы их обновите, а затем другое на основе других условий... вы должны использовать транзакцию.
Ответ 7
Вы можете написать оператор update для одной таблицы, а затем триггер в первой таблице, обновление вторая таблица
Ответ 8
Это так же просто, как этот запрос, показанный ниже.
UPDATE
Table1 T1 join Table2 T2 on T1.id = T2.id
SET
T1.LastName='DR. XXXXXX',
T2.WAprrs='start,stop'
WHERE
T1.id = '010008'