Обновить в нескольких таблицах, установить несколько значений - PullRequest
0 голосов
/ 28 сентября 2019

Мне нужно обновить одну строку только около одного дня недели.

UPDATE room
INNER JOIN giorni ON (room.IDRoom = giorni.FKRoom)
INNER JOIN aperture ON (giorni.FKApertura = aperture.IDApertura )
SET StatoBloccato = true, 
  Aperto = true, 
  OrarioApertura = '09:00:00', 
  OrarioChiusura = '19:00:00' 
WHERE giorni.Nome LIKE 'Lun' 
AND room.IDRoom = 1;

Идея состоит в том, чтобы установить StatoBloccato как true , только длядень "Лунь".Но этот запрос установил StatoBloccato как true для всех дней.Что не так?

Вот пример: вот пример (кажется, не стоит читать предложение WHERE)

Это мое объединение в 3 таблицы: https://pastebin.com/n3b3dYvm

1 Ответ

0 голосов
/ 28 сентября 2019

Запрос, который вы вставили выше, будет содержать только UPDATE строк для IDRoom= 1, которые имеют точное значение lun для giorni.Nome.

Когда вы используете оператор LIKE, он обычно связан с подстановочным знаком (%).Если вы измените его на WHERE giorni.Nome LIKE 'lun%', то это будет соответствовать всему, что начинается с lun.Только будьте осторожны, он может быть чувствителен к регистру.

Если ваш исходный запрос не работает, есть разные способы сделать то же самое, чтобы увидеть, дает ли он результаты, которые вы хотите.Вот один из них:

UPDATE room
SET StatoBloccato = true, 
  Aperto = true, 
  OrarioApertura = '09:00:00', 
  OrarioChiusura = '19:00:00' 
WHERE IDRoom = 1 -- Only update "room 1"
AND EXISTS ( -- Check other before updating "room 1"
  SELECT 1
  FROM giorni
  INNER JOIN aperture ON (giorni.FKApertura = aperture.IDApertura)
  WHERE giorni.Nome LIKE 'lun'
  AND giorni.FKRoom = 1
)

SQL Fiddle

Обновление
Поскольку вы хотите обновить несколько таблиц одновременно, у вас есть парапараметры:

1) Возврат к мульти-таблице UPDATE с парой модификаций:

  • добавление giorni таблицы в список таблиц
  • уточнение столбцов вSET список
  • добавление подстановочного знака (%) к оператору LIKE
UPDATE room r, giorni g
SET r.StatoBloccato = true, 
  g.Aperto = true, 
  g.OrarioApertura = '09:00:00', 
  g.OrarioChiusura = '19:00:00' 
WHERE r.IDRoom = g.FKRoom
AND g.Nome LIKE 'Lun%' 
AND r.IDRoom = 1;

MySQL - обновление нескольких таблиц

2) Добавьте секунду UPDATE и запустите обе в одной транзакции

START TRANSACTION;

UPDATE room
SET StatoBloccato = true
WHERE IDRoom = 1 -- Only update "room 1"
AND EXISTS ( -- Check other before updating "room 1"
  SELECT 1
  FROM giorni
  INNER JOIN aperture ON (giorni.FKApertura = aperture.IDApertura)
  WHERE giorni.Nome LIKE 'lun%'
  AND giorni.FKRoom = 1
)

UPDATE giorni
SET Aperto = true, 
  OrarioApertura = '09:00:00', 
  OrarioChiusura = '19:00:00' 
WHERE FKRoom = 1 -- Only update "room 1"
AND EXISTS ( -- Check other before updating "room 1"
  SELECT 1
  FROM giorni
  INNER JOIN aperture ON (giorni.FKApertura = aperture.IDApertura)
  WHERE giorni.Nome LIKE 'lun%'
  AND giorni.FKRoom = 1
)

COMMIT;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...