Как вставить последовательный номер на той же вставке в последовательности? - PullRequest
0 голосов
/ 02 сентября 2018

Как вставить в таблицу число, равное количеству записей с того же FK плюс 1.

Объяснение: есть таблица, которая будет содержать количество фаз (1,2,3 ...). Когда создается новая фаза, я хотел бы сделать номер столбца суммой числа уже существующих фаз.

Я пытался использовать COUNT

В planId 204 будет 3 фазы. В HTML-форме я только хочу получить имя и год. Пользователь не несет ответственности за номер этапа. Это порядковый номер при добавлении.

INSERT INTO 
        phase (
        idPlan,
        name,
        number,
        constructionYear
        )
        VALUES (
        204,
        'jj',
         HERE IS THE SEQUENTIAL NUMBER,
        2001
        )

CREATE TABLE `phase` (
 `idPhase` int(11) NOT NULL AUTO_INCREMENT,
 `idPlan` int(11) NOT NULL,
 `number` int(11) NOT NULL,
 `constructionYear` year(4) NOT NULL,
 `name` varchar(100) DEFAULT NULL,
 PRIMARY KEY (`idPhase`),
 KEY `idPlan` (`idPlan`),
 KEY `idPlan_2` (`idPlan`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8

1 Ответ

0 голосов
/ 03 сентября 2018

Этого можно добиться с помощью триггера на INSERT:

CREATE TRIGGER `phase_insert`
BEFORE INSERT ON `phase` FOR EACH ROW 
SET NEW.number = (SELECT COALESCE(MAX(number),0)+1 FROM phase WHERE idPlan=NEW.idPlan)

Это найдет максимальное значение number перед тем, как INSERT на этом значении idPlan увеличит его на 1, а затем вставит это значение. В случае отсутствия записи для значения iDPlan, COALESCE(MAX(number),0) вернет 0, поэтому будет вставлено 1.

например. в пустой таблице

INSERT INTO phase (idPlan, name, number, constructionYear)
    VALUES (204, 'jj', 0, 2001), (204, 'xx', 0, 2002);
SELECT * FROM phase

Выход:

idPhase     idPlan  number  constructionYear    name
3           204     1       2001                jj
4           204     2       2002                xx
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...