MySQL: обновление таблицы при определенных условиях - PullRequest
0 голосов
/ 02 мая 2018

У меня есть 2 таблицы, основная и текущая (обновлены очень час). Оба стола бреются одинаковой структуры:

Чк | описание | состояние | дата

Мне нужно обновить / добавить (добавить новую строку) в основную таблицу, если:

1) строки с новыми идентификаторами или

2) если конкретная переменная (в данном случае «состояние») изменилась. Я попытался сделать это, используя ниже, но безуспешно:

INSERT  into AGILE_TICKETS_DLY 
SELECT * FROM CURR_AGILE_TICKETS curr
  WHERE EXISTS (SELECT * FROM AGILE_TICKETS_DLY mstr
          WHERE (curr.chk != mstr.chk) OR ( curr.chk = mstr.chk and 
    mstr.state != curr.state))

Есть ли какие-нибудь указатели о том, как этого добиться?

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Вы можете попробовать эту пару запросов:

-- insert new rows
insert into agile_tickets_dly
select * from curr_agile_tickets 
where chk not in (select chk from agile_tickets_dly);

-- update updated rows
update agile_tickets_dly x
join 
(
    select b.chk chk,b.description description,b.state state,b.date date 
    from agile_tickets_dly a, curr_agile_tickets b
    where 
        a.chk=b.chk and
        (a.description != b.description or a.state != b.state or a.date != b.date)
) y
on x.chk=y.chk
set x.description = y.description, x.state= y.state, x.date = y.date;

Иллюстрация:

select * from agile_tickets_dly;
+------+-------------+---------+------------+
| chk  | description | state   | date       |
+------+-------------+---------+------------+
| 0    | desc-0      | state-1 | 01-01-2017 |
| 1    | desc-1      | state-1 | 01-01-2018 |
| 2    | desc-2      | state-2 | 01-02-2018 |
| 3    | desc-3      | state-3 | 01-03-2018 |
+------+-------------+---------+------------+

-- one new row with chk=4, three updated rows with chk=1,2,3
select * from curr_agile_tickets;
+------+----------------+-----------------+----------------+
| chk  | description    | state           | date           |
+------+----------------+-----------------+----------------+
| 0    | desc-0         | state-1         | 01-01-2017     |
| 1    | desc-1         | state-1         | date-1-updated |
| 2    | desc-2-updated | state-2         | 01-02-2018     |
| 3    | desc-3         | state-3-updated | 01-03-2018     |
| 4    | desc-4         | state-4         | 01-04-2018     |
+------+----------------+-----------------+----------------+

-- after executing the two queries
select * from agile_tickets_dly;
+------+----------------+-----------------+----------------+
| chk  | description    | state           | date           |
+------+----------------+-----------------+----------------+
| 0    | desc-0         | state-1         | 01-01-2017     |
| 1    | desc-1         | state-1         | date-1-updated |
| 2    | desc-2-updated | state-2         | 01-02-2018     |
| 3    | desc-3         | state-3-updated | 01-03-2018     |
| 4    | desc-4         | state-4         | 01-04-2018     |
+------+----------------+-----------------+----------------+
0 голосов
/ 02 мая 2018

Я пытался сделать это в 2 отдельных шага:

1) Сначала я добавляю все новые строки с идентификаторами: это сработало

INSERT  into AGILE_TICKETS_DLY 
 SELECT * FROM CURR_AGILE_TICKETS curr
  WHERE not EXISTS (SELECT * FROM AGILE_TICKETS_DLY mstr
          WHERE (curr.chk = mstr.chk));

Но потом я попытался сделать ниже, получил ошибку

2) Затем замените переменную 'State' новым значением:

 INSERT  into AGILE_TICKETS_DLY_1 (state)
SELECT state 
  from CURR_AGILE_TICKETS_1 curr
where exists ( select * from AGILE_TICKETS_DLY_1 mstr where curr.chk = 
       mstr.chk);

Но это дает мне ошибку:

Ошибка SQL (1364): поле 'chk' не имеет значения по умолчанию.

Что это значит?

...