MySQL UPDATE, если что-то изменилось в другой таблице [duplicate]

На этом сайте есть отличные примеры проверьте

  // создайте дату создания 2008-03-09 16: 05: 07.123 DateTime dt = new DateTime (2008)  , 3, 9, 16, 5, 7, 123);  String.Format ("{0: y yy yyy yyyy}", dt);  // "8 08 008 2008" year String.Format ("{0: M MM MMM MMMM}", dt);  // «3 марта марта» месяц String.Format («{0: d dd ddd dddd}», dt);  // "9 09 Sun Sunday" day String.Format ("{0: h hh H HH}", dt);  // «4 04 16 16» час 12/24 String.Format («{0: m mm}», dt);  // "5 05" минута String.Format ("{0: s ss}", dt);  // "7 07" второй String.Format ("{0: f ff fff ffff}", dt);  // "1 12 123 1230" sec.fraction String.Format ("{0: F FF FFF FFFF}", dt);  // "1 12 123 123" без нулей String.Format ("{0: t tt}", dt);  // «П ПМ» А.М.  или P.M.  String.Format ("{0: z zz zzz}", dt);  // "-6 -06 -06: 00" часовой пояс // числа месяц / день без / с ведущими нулями String.Format ("{0: M / d / yyyy}", dt);  // "3/9/2008" String.Format ("{0: MM / dd / yyyy}", dt);  // "03/09/2008" // имя дня / месяца String.Format ("{0: ddd, MMM d, yyyy}", dt);  // «Sun, Mar 9, 2008» String.Format («{0: dddd, MMMM d, yyyy}», dt);  // «Sunday, March 9, 2008» // two / four digit year String.Format («{0: MM / dd / yy}», dt);  // "03/09/08" String.Format ("{0: MM / dd / yyyy}", dt);  // "03/09/2008"  

Стандартное форматирование DateTime

  String.Format ("{0: t}", dt);  // "4:05 PM" ShortTime String.Format ("{0: d}", dt);  // "3/9/2008" ShortDate String.Format ("{0: T}", dt);  // "4:05:07 PM" LongTime String.Format ("{0: D}", dt);  // «Sunday, March 09, 2008» LongDate String.Format («{0: f}», dt);  // "Sunday, March 09, 2008 4:05 PM" LongDate + ShortTime String.Format ("{0: F}", dt);  // "Sunday, March 09, 2008 4:05:07 PM" FullDateTime String.Format ("{0: g}", dt);  // "3/9/2008 16:05" ShortDate + ShortTime String.Format ("{0: G}", dt);  // "3/9/2008 4:05:07 PM" ShortDate + LongTime String.Format ("{0: m}", dt);  // «Март 09» MonthDay String.Format («{0: y}», dt);  // «Март 2008» YearMonth String.Format («{0: r}», dt);  // "Sun, 09 Mar 2008 16:05:07 GMT" RFC1123 String.Format ("{0: s}", dt);  // "2008-03-09T16: 05: 07" SortableDateTime String.Format ("{0: u}", dt);  // «2008-03-09 16: 05: 07Z». Спецификатор DateTimeFormatInfo. Значение шаблона (для культуры в США) t ShortTimePattern h: mm tt d ShortDatePattern M / d / yyyy T LongTimePattern h: mm: ss tt  D LongDatePattern dddd, MMMM dd, yyyy f (комбинация D и t) dddd, MMMM dd, yyyy h: mm tt F FullDateTimePattern dddd, MMMM dd, yyyy h: mm: ss tt g (комбинация d и t) M /  d / yyyy h: mm tt G (комбинация d и T) M / d / yyyy h: mm: ss tt m, M MonthDayPattern MMMM dd y, Y YearMonthPattern MMMM, yyyy r, R RFC1123Pattern ddd, dd MMM yyyy HH '  : 'mm': 'ss' GMT '(*) s SortableDateTimePattern yyyy' - 'MM' - 'dd'T'HH': 'mm': 'ss (*) u UniversalSortableDateTimePattern yyyy' - 'MM' - 'dd  HH ':' mm ':' ss'Z '(*) (*) = независимый от культуры * /  

Обновление с использованием формата интерполяции строк c # 6

  // время создания 2008-03-09 16: 05: 07.123 DateTime dt = new DateTime (2008, 3, 9, 16, 5, 7, 123);  $ "{dt: y yy yyy yyyy}";  // «8 08 008 2008» год $ «{dt: M MM MMM MMMM}";  // «3 марта марта« месяц $ »{dt: d dd ddd dddd}";  // "9 09 Sun Sunday" день $ "{dt: h hh H HH}";  // "4 04 16 16" час 12/24 $ "{dt: m mm}";  // "5 05" минута $ "{dt: s ss}";  // "7 07" second $ "{dt: f ff fff ffff}";  // "1 12 123 1230" sec.fraction $ "{dt: F FF FFF FFFF}";  // "1 12 123 123" без нулей $ "{dt: t tt}";  // «П ПМ» А.М.  или P.M.  $ "{dt: z zz zzz}";  // "-6 -06 -06: 00" часовой пояс // числа месяц / день без / с ведущими нулями $ "{dt: M / d / yyyy}";  // "3/9/2008" $ "{dt: MM / dd / yyyy}";  // "03/09/2008" // день / месяц имен $ "{dt: ddd, MMM d, yyyy}";  // "Sun, 9 марта 2008 г." $ "{dt: dddd, MMMM d, yyyy}";  // «Воскресенье, 9 марта 2008 г.» // два / четыре цифры года $ "{dt: MM / dd / yy}";  // "03/09/08" $ "{dt: MM / dd / yyyy}";  // «03/09/2008»  

92
задан Ryan Kohn 17 January 2013 в 22:07
поделиться

6 ответов

Вы можете сделать это с помощью хранимой процедуры, объединив операторы UPDATE в одной транзакции.

-17
ответ дан Ryan Kohn 15 August 2018 в 21:16
поделиться
  • 1
    Хотя хранимая процедура будет работать, mysql поддерживает обновление с помощью JOIN – DavidScherer 18 April 2017 в 18:30

Когда вы говорите несколько запросов, вы имеете в виду несколько операторов 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 ().

1
ответ дан code_burgar 15 August 2018 в 21:16
поделиться
  • 1
    да, как я могу это достичь? – Adamski 6 December 2010 в 00:00
  • 2
    обновил мой ответ в соответствии с вашим вопросом. – code_burgar 6 December 2010 в 00:06
  • 3
    mySql Query () - это настраиваемая функция или встроенная функция? Я хочу узнать больше об этом. – Debashis 13 September 2012 в 10:41
  • 4
    Нет существенной разницы между отправкой трех запросов отдельно или в виде множественного запроса, за исключением, возможно, если функция запроса открывает новое соединение каждый раз. С точки зрения выполнения на стороне сервера это одно и то же – Duncan 27 February 2016 в 10:57

Вы также можете сделать это с помощью одного запроса, используя соединение так:

UPDATE table1,table2 SET table1.col=a,table2.col2=b
WHERE items.id=month.id;

И тогда просто отправьте этот один запрос, конечно. Вы можете узнать больше о объединениях здесь: http://dev.mysql.com/doc/refman/5.0/ru/join.html . Также есть несколько ограничений для заказа и ограничения на несколько обновлений таблиц, которые вы можете прочитать здесь: http://dev.mysql.com/doc/refman/5.0/en/update.html (просто ctrl + f "join").

30
ответ дан Stephen Searles 15 August 2018 в 21:16
поделиться

Обычно это хранимые процедуры: для реализации нескольких операторов SQL в последовательности. Используя откаты, вы можете убедиться, что они рассматриваются как одна единица работы, то есть либо все они выполнены, либо ни одна из них не поддерживает согласование данных.

0
ответ дан SteveCav 15 August 2018 в 21:16
поделиться
  • 1
    где бы я написал процедуру? не могли бы вы привести пример? – Adamski 6 December 2010 в 00:05
  • 2
    Проголосовать за объяснение необходимости атомарности - также важно понимать, что использование хранимых процедур не гарантирует стабильность, вам все равно нужно использовать транзакции; аналогичным образом, транзакции могут выполняться без использования хранимой процедуры при условии, что они выполняются по одному и тому же соединению. В этом случае использование обновления с несколькими таблицами еще лучше. – Duncan 27 February 2016 в 11:04

Возьмем случай с двумя таблицами, 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;
373
ответ дан Tikas Mamed 15 August 2018 в 21:16
поделиться
  • 1
    Как это не может быть принятым ответом. – eddy147 17 June 2014 в 08:15
  • 2
    Если я хочу включить & quot; LIMIT & quot; к SQL Query, должен ли я говорить LIMIT 1 или LIMIT 2? – Bluedayz 25 August 2014 в 17:31
  • 3
    В чем преимущество этого и транзакции? Благодаря! – paulkon 31 October 2014 в 14:34
  • 4
    @paulkon, я полагаю, что при использовании транзакций есть много накладных расходов, поскольку откаты должны быть доступны, если какая-либо процедура в транзакции терпит неудачу. – Thijs Riezebeek 3 March 2015 в 20:45
  • 5
    Общее предупреждение при использовании этого запроса. Предложение WHERE оценивается отдельно для каждой таблицы. Books.BookID = Orders.BookID очень важен, без него Обновление таблицы Books будет происходить со всеми строками, а не только для строки с указанным идентификатором. Некоторые уроки изучены трудно, этот был изучен ужасно. – nheimann1 24 March 2015 в 16:06
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, например :

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';
36
ответ дан Wodin 15 August 2018 в 21:16
поделиться
  • 1
    это гораздо более надежный ответ, чем популярный, и охватывает более сложные случаи. – Lizardx 9 March 2017 в 01:44
Другие вопросы по тегам:

Похожие вопросы: