У мене є функція, яка оновлює три таблиці, але для цього я використовую три запити. Я хочу використовувати більш зручний підхід для належної практики.
Як я можу оновити кілька таблиць у MySQL за допомогою одного запиту?
У мене є функція, яка оновлює три таблиці, але для цього я використовую три запити. Я хочу використовувати більш зручний підхід для належної практики.
Як я можу оновити кілька таблиць у MySQL за допомогою одного запиту?
Відповіді:
Візьміть випадок двох таблиць Books
і Orders
. У разі, якщо ми збільшуємо кількість книг в певному порядку з Order.ID = 1002
в Orders
таблиці , то ми повинні також скоротити , що загальне число книг , доступних на нашому складі по тим же номером в Books
таблиці.
UPDATE Books, Orders
SET Orders.Quantity = Orders.Quantity + 2,
Books.InStock = Books.InStock - 2
WHERE
Books.BookID = Orders.BookID
AND Orders.OrderID = 1002;
UPDATE t1
INNER JOIN t2 ON t2.t1_id = t1.id
INNER JOIN t3 ON t2.t3_id = t3.id
SET t1.a = 'something',
t2.b = 42,
t3.c = t2.c
WHERE t1.a = 'blah';
Щоб побачити, що це буде оновлено, ви можете перетворити це у вибраний оператор, наприклад:
SELECT t2.t1_id, t2.t3_id, t1.a, t2.b, t2.c AS t2_c, t3.c AS t3_c
FROM t1
INNER JOIN t2 ON t2.t1_id = t1.id
INNER JOIN t3 ON t2.t3_id = t3.id
WHERE t1.a = 'blah';
Приклад, що використовує ті ж таблиці, що й інша відповідь:
SELECT Books.BookID, Orders.OrderID,
Orders.Quantity AS CurrentQuantity,
Orders.Quantity + 2 AS NewQuantity,
Books.InStock AS CurrentStock,
Books.InStock - 2 AS NewStock
FROM Books
INNER JOIN Orders ON Books.BookID = Orders.BookID
WHERE Orders.OrderID = 1002;
UPDATE Books
INNER JOIN Orders ON Books.BookID = Orders.BookID
SET Orders.Quantity = Orders.Quantity + 2,
Books.InStock = Books.InStock - 2
WHERE Orders.OrderID = 1002;
Редагувати:
Просто для розваги додамо щось трохи цікавіше.
Скажімо, у вас є таблиця books
та таблиця authors
. У вас books
є author_id
. Але коли база даних була створена спочатку, жодних обмежень щодо зовнішніх ключів не було встановлено, а пізніше помилка в коді передумови викликала додавання деяких книг з недійсними author_id
s. Як DBA, вам не потрібно проходити все це, books
щоб перевірити, що author_id
має бути, тому приймається рішення, що фіксатори даних будуть фіксувати books
точку вправо authors
. Але є занадто багато книг, щоб пройти кожну з них, і скажемо, що ви знаєте, що ті, у яких є author_id
відповідність дійсним, author
є правильними. Це просто ті, які не існуютьauthor_id
s, які є недійсними. Вже є інтерфейс для користувачів, щоб оновити реквізити книги, і розробники не хочуть змінювати це лише для цієї проблеми. Але існуючий інтерфейс робить INNER JOIN authors
, тому всі книги з недійсними авторами виключені.
Що ви можете зробити, це: вставити підроблений авторський запис на зразок "Невідомий автор". Потім оновіть author_id
всі погані записи, щоб вказати на Невідомого автора. Тоді фіксатори даних можуть шукати всі книги з автором, встановленим на "Невідомий автор", шукати правильного автора та виправляти їх.
Як ви оновлюєте всі погані записи, щоб вказати на Невідомого автора? Ось так (припускаючи, що Невідомий автор author_id
99999):
UPDATE books
LEFT OUTER JOIN authors ON books.author_id = authors.id
SET books.author_id = 99999
WHERE authors.id IS NULL;
Викладене вище також буде оновлено, books
які мають NULL
author_id
невідомого автора. Якщо ви цього не хочете, звичайно, можете додати AND books.author_id IS NOT NULL
.
Ви також можете зробити це за допомогою одного запиту, використовуючи приєднання на зразок:
UPDATE table1,table2 SET table1.col=a,table2.col2=b
WHERE items.id=month.id;
А потім просто надішліть цей запит, звичайно. Детальніше про приєднання ви можете прочитати тут: http://dev.mysql.com/doc/refman/5.0/uk/join.html . Також є кілька обмежень для замовлення та обмеження кількох оновлень таблиці, про які ви можете прочитати тут: http://dev.mysql.com/doc/refman/5.0/en/update.html (просто ctrl + f "приєднатися").
Ось зазвичай для цього зберігаються процедури: реалізувати кілька операторів SQL в послідовності. Використовуючи зворотні звороти, ви можете переконатися, що вони розглядаються як одна одиниця роботи, тобто або всі вони виконуються, або жодна з них не забезпечує збереження даних.
Коли ви говорите кілька запитів, ви маєте на увазі кілька операторів SQL, як у:
UPDATE table1 SET a=b WHERE c;
UPDATE table2 SET a=b WHERE d;
UPDATE table3 SET a=b WHERE e;
Або кілька запитів функцій запитів, як у:
mySqlQuery(UPDATE table1 SET a=b WHERE c;)
mySqlQuery(UPDATE table2 SET a=b WHERE d;)
mySqlQuery(UPDATE table3 SET a=b WHERE e;)
Перше все можна зробити за допомогою одного виклику mySqlQuery, якщо саме цього ви хотіли досягти, просто зателефонуйте до функції mySqlQuery таким чином:
mySqlQuery(UPDATE table1 SET a=b WHERE c; UPDATE table2 SET a=b WHERE d; UPDATE table3 SET a=b WHERE e;)
Це виконає всі три запити одним викликом mySqlQuery ().