Как вставить запись в mysql, даже если ключ отсутствует - PullRequest
0 голосов
/ 15 марта 2020


У меня есть такая таблица:

id  ctr
A    1

Я хотел бы вставить строку с идентификатором A и обновить значение ctr до 2 Новое значение ctr, равное 2, основано на предыдущее значение увеличилось на 1.
Таблица будет выглядеть следующим образом.

id   ctr
A     1
A     2

Теперь я хотел бы вставить еще одну строку идентификатора B. Но поскольку B не существует в таблице, он будет иметь счетчик инициализирован на 1. Таким образом, таблица будет выглядеть следующим образом.

id   ctr
A     1
A     2
B     1

Есть ли способ сделать это в одном операторе sql? (Я предпочитаю mysql) Большое спасибо.

Отредактировано: На самом деле таблица очень проста. фактическая таблица будет выглядеть следующим образом:

id   amt balance  ctr
A    100   100     1
A    150   250     2
B    50    50      1

Как и в случае ctr, баланс равен amt + предыдущий баланс.
Это все вставки и никаких обновлений. Благодаря.

Ответы [ 3 ]

1 голос
/ 15 марта 2020

Вы можете создать первичный ключ на id с помощью ctr и установить автоинкремент ctr.

Таким образом, каждый раз, когда вы вставляете запись с id = A, ctr будет автоматически увеличиваться.

`ctr` int(11) NOT NULL AUTO_INCREMENT, 
...
PRIMARY KEY (`id`,`ctr`)
0 голосов
/ 15 марта 2020

Вы можете express в одном запросе как:

insert into t (id, ctr)
    select id, coalesce(max(ctr) + 1, 0)
    from (select 'a' as id union all
          select 'b' as id
         ) x left join
         t
         using (id)
    group by id;
0 голосов
/ 15 марта 2020

Вы можете использовать COALESCE( MAX(ID)+1, 1 ), чтобы инициализировать INSERT Statement для идентификатора несуществующего письма как

SET @ctr = 'B';

INSERT INTO tab 
SELECT COALESCE(MAX(ID)+1,1),@ctr FROM tab WHERE ctr = @ctr

Демо

даже для случаев уникальный ключ не существует , в противном случае с использованием

INSERT INTO ...
SELECT ... FROM ...
ON DUPLICATE KEY UPDATE ... 

подойдет лучше для использования.

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