Mysql вставить значение с подсчетом одной таблицы Coumn - PullRequest
0 голосов
/ 25 мая 2020

Не понимая, почему что-то вроде этого не работает, я прочитал много официальной документации и ответов здесь, но все еще не могу понять, как заставить это работать в одном запросе при вставке без транзакций, если это возможно.

Мне нужно что-то вроде:

INSERT INTO PREDMETIP
    (`predp_nas`)
VALUES((SELECT COUNT(strp_ID) FROM PREDMETIP WHERE strp_ID = '1')+1,

Мне нужен этот результат:

| predp_id | strp_ID | predp_nas |
| -------- | ------- | --------- |
| 1        | 1       |     1     |
| 2        | 1       |     2     |
| 3        | 1       |     3     |
| 4        | 2       |     1     |
| 5        | 2       |     2     |
| 6        | 3       |     1     |

Где столбец predp_nas - это количество столбцов strp_ID + 1 при каждой новой вставке.

CREATE TABLE PREDMETIP (
  predp_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  strp_ID INT NOT NULL,
  predp_nas INT(11) NULL
);

INSERT INTO PREDMETIP
    (`strp_ID`)
VALUES(1),(1),(1),(2),(2),(3);

INSERT INTO PREDMETIP
    (`strp_ID`, `predp_nas`)
VALUES(1, 
   (SELECT COUNT(strp_ID) FROM PREDMETIP WHERE strp_ID = '1')+1);

Я создал скрипт DB, например .

Если вы удалите последнюю вставку, это данные, которые есть в таблице, но мне нужна вторая вставка, чтобы она работала и дала мне результат:

| predp_id | strp_ID | predp_nas |
| -------- | ------- | --------- |
| 7        | 1       |     4     |

Очевидно, что проблема с выбором количества из той же таблицы, в которую производится вставка. При этом я знаю, как совершить транзакцию и сделать это в двух запросах. Но меня интересует 1 решение запроса, если это возможно. У меня есть документация, в которой мне не хватает некоторых знаний, чтобы выполнить эту работу.

Заранее благодарю

Ответы [ 3 ]

2 голосов
/ 25 мая 2020

Похоже, вам нужен синтаксис insert ... select:

INSERT INTO PREDMETIP(strp_ID, predp_nas)
SELECT 1, COUNT(*) + 1 FROM PREDMETIP WHERE strp_ID = 1
1 голос
/ 25 мая 2020

Вам необходимо указать псевдоним для внутреннего выбора, как показано ниже, чтобы отличить guish его от основного запроса.

INSERT INTO PREDMETIP
(`strp_ID`, `predp_nas`)
VALUES(1,  (SELECT COUNT(strp_ID) FROM PREDMETIP p WHERE p.strp_ID = '1')+1);
1 голос
/ 25 мая 2020

MySql не разрешает прямые ссылки на обновленную таблицу при вставках, удалениях и обновлениях. Вы должны вложить свой запрос в другой следующим образом:

INSERT INTO PREDMETIP
    (`strp_ID`, `predp_nas`)
VALUES(
 1, 
 (SELECT counter + 1 FROM (SELECT COUNT(strp_ID) counter FROM PREDMETIP WHERE strp_ID = '1') t)
);

См. demo .

...