#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());