Проблема SQL с insert в инструкции if

#mysql #database #stored-procedures

#mysql #База данных #хранимые процедуры

Вопрос:

 DROP PROCEDURE IF EXISTS kund2orderNew;
DELIMITER ;;
CREATE PROCEDURE kund2orderNew(kundId2 INT)
BEGIN
IF kundId2 <> (SELECT kundId FROM kund2order) THEN
    INSERT INTO kundOrder VALUES ();
    INSERT INTO kund2order VALUES (kundId2, (SELECT id FROM kundOrder)); 
END IF;
END
;;
DELIMITER ;
  

Хорошо, я делаю что-то не так здесь? Что я пытаюсь сделать, так это проверить, есть ли kundId в kund2order, если его нет, то я хочу создать новую строку в таблице kundOrder, которая просто использует значения по умолчанию, а затем взять недавно созданный идентификатор из этой строки в kundOrder и поместить его в новую строку в kund2order (вместе с kundId).

По какой-то причине это просто выдает мне (узел: 18328) необработанное предупреждение Promiserejectionwarning: Ошибка: ER_BAD_NULL_ERROR: столбец ‘kundId’ не может быть нулевым

Я немного сбит с толку относительно того, в чем проблема, обе таблицы пусты после того, как я вызвал эту процедуру. Проблема в моем операторе if или в чем-то другом?

Комментарии:

1. Помимо других проблем, ваша первая IF имеет очевидную потенциальную проблему, заключающуюся в том, что подзапрос в RHS может возвращать более одной записи. Возможно, вы намеревались использовать WHERE NOT IN ... , но в любом случае это помогло бы вашему вопросу лучше объяснить, что вы пытаетесь здесь сделать.

2. Если kundId2 не соответствует ни одному kundId в таблице kund2order, я хочу выполнить приведенные ниже инструкции Insert. Если это что-то соответствует, то я хочу, чтобы ничего не происходило

3. Это не то, как вы проверяете, есть ли kundid2 в таблице.

4. @Barmar Как бы я тогда это сделал?

Ответ №1:

Это неправильный способ проверить, есть ли идентификатор уже в таблице. Когда вы используете SELECT запрос в качестве выражения, он должен возвращать только одну строку. Вы можете использовать:

 IF NOT EXISTS (SELECT * FROM kund2Order WHERE kundId = kundId2) THEN
  

И если вы хотите вставить автоматическое увеличение строки, которая только что была вставлена в kundOrder , вам следует использовать LAST_INSERT_ID() :

 INSERT INTO kund2order VALUES (kundId2, LAST_INSERT_ID());