2010-03-08 3 views
3

у меня есть схема, как:запрос на обновление на нескольких столах

  • сотрудников (ENO, ENAME, застежка-молния, hdate)
  • клиентов (CNO, cnmae, улица, почтовый индекс, телефон)
  • Почтовые индексы (zip, city)

где zip - это pk в zipcodes и fk в других таблицах.
Мне нужно написать запрос обновления, который обновляет все происхождение zipcode 4994 до 1234 по всей базе данных.

update zipcodes,customers,employees 
    set zip = 0 
where customers.zip = zipcodes.zip 
    and employees.zip = zipcodes.zip; 

но я знаю, что не делаю это правильно. Есть ли способ обновить все таблицы zip в одном запросе на обновление?

ответ

1

Я думаю, вы должны сначала вставить новую строку для нового zip в таблицу zipcode, обновить zip в остальных таблицах и, наконец, удалить старый zipcode.

+0

разве есть способ сделать это только с помощью обновлений – jon

+0

Вы можете сделать это так, как вы указали, но мог бы.? необходимо заблокировать систему на время обновления.На самом деле, вам нужно заблокировать таблицы от вставки в обоих случаях. – Kangkan

2

Вы не можете обновить несколько таблиц в одном операторе обновления. Вам нужно будет написать несколько инструкций обновления.

NEW THOUGHT: Вы можете добавить триггеры, чтобы обновить строку, так что ваше приложение может обновить 1 таблицу, а триггеры будут распространять остальные.

+0

SQL> обновить zipcodes set zip = 1234 где zip = 67226; обновить zipcodes * ERROR в строке 1: ORA-02292: нарушение целостности нарушено - найдена детская запись – jon

+0

Я сказал то же самое @OMG Ponies сказал, и вы отправили тот же ответ. –

3

Oracle не поддерживает инструкции по обновлению нескольких таблиц.

  1. Убедитесь, что почтовый индекс "1234" существует в ZIPCODES таблице

    INSERT INTO ZIPCODES 
        (zip, city) 
    VALUES 
        (1234, '?') 
    
  2. Написать отдельные заявления обновления для клиентов и сотрудников таблиц:

    UPDATE CUSTOMERS 
        SET zip = 1234 
    WHERE zip = 4994 
    
    UPDATE EMPLOYEES 
        SET zip = 1234 
    WHERE zip = 4994 
    
  3. удалить предыдущий код:

    DELETE FROM ZIPCODES 
    WHERE zip = 4994 
    
+0

Я получаю это ОБНОВЛЕНИЕ Почтовые индексы * ОШИБКА в строке 1: ORA-02292: нарушение целостности нарушено - найдена детская запись – jon

+0

@jon - сообщение об ошибке указывает, что вы обновляете таблицу ZIPCODES, чего не предлагает OMG Ponies. –

0

Использовать хранимую процедуру. Там вы можете выполнить эту операцию с несколькими таблицами с помощью условных операторов.

+1

По-прежнему потребуется несколько операторов обновления. Просто все в одной оболочке в качестве хранимой процедуры. –

0

Это может привести к вашей проблеме. И вы можете обновить или удалить в течение петли basend на значениях

Begin 
for Zip_value in 1234.. 4559 loop 
update zipcodes 
    set zip = 0 
where customers.zip = zipcodes.zip 
    and employees.zip = zipcodes.zip; 
    and zipcodes.zip = Zip_value; 
update customers 
    set zip = 0 
where customers.zip = zipcodes.zip 
    and employees.zip = zipcodes.zip; 
    and zipcodes.zip = Zip_value; 
update employees 
    set zip = 0 
where customers.zip = zipcodes.zip 
    and employees.zip = zipcodes.zip; 
    and zipcodes.zip = Zip_value; 
    END LOOP; 
commit; 
end; 
/
1

я не проверял - но: язык SQL позволяет обновляемых представлений. Если вы посмотрите here, вы увидите, что Oracle действительно поддерживает неотъемлемо обновляемые представления. Таким образом, вы могли бы, вероятно, обновить больше таблиц с помощью одного оператора. Есть некоторые ограничения, описанные here о соединениях, но по крайней мере что-то должно быть возможно.

Однако; это явно не применимо к вашей ситуации, несколько заявлений будут работать намного лучше. То, что вы могли бы подумать, - «об обновлении каскада», таким образом, вы обновили бы таблицу городами с новым zipcode, и клиенты и сотрудники автоматически обновились.

Обновления: на обновление каскад не работает в Oracle :(Так триггера или нескольких операторов

Смежные вопросы