Этот вопрос находится в последовательности моего предыдущего Вопроса, требуемого обновления той же таблицы при удалении строки.
Я могу написать два решения, используя Сохраненная процедура вместо триггера или вложенного запроса.
Оба используют вспомогательную функцию my_signal (msg).
Сохраненная процедура удаления сотрудника из таблицы Employee
.
- Решение Fist: используйте
UPDATE
строки в таблице, без операции соединения:
CREATE PROCEDURE delete_employee(IN dssn varchar(64)) BEGIN DECLARE empDesignation varchar(128); DECLARE empSsn varchar(64); DECLARE empMssn varchar(64); SELECT SSN, designation, MSSN INTO empSsn, empDesignation, empMssn FROM Employee WHERE SSN = dssn; IF (empSsn IS NOT NULL) THEN CASE WHEN empDesignation = 'OWNER' THEN CALL my_signal('Error: OWNER can not deleted!'); WHEN empDesignation = 'WORKER' THEN DELETE FROM Employee WHERE SSN = empSsn; WHEN empDesignation = 'BOSS' THEN BEGIN UPDATE Employee SET MSSN = empMssn WHERE MSSN = empSsn; DELETE FROM Employee WHERE SSN = empSsn; END; END CASE; ELSE CALL my_signal('Error: Not a valid row!'); END IF; END//
- Второе решение:, как мне было предложено в предыдущем вопросе, используя
INNER JOIN
CREATE PROCEDURE delete_employee(IN dssn varchar(64)) BEGIN DECLARE empDesignation varchar(128); DECLARE empSsn varchar(64); DECLARE empMssn varchar(64); SELECT SSN, designation, MSSN INTO empSsn, empDesignation, empMssn FROM Employee WHERE SSN = dssn; IF (empSsn IS NOT NULL) THEN IF (empDesignation = 'OWNER') THEN CALL my_signal('Error: OWNER can not deleted!'); END IF; UPDATE `Employee` A INNER JOIN `Employee` B ON A.SSN= B.MSSN SET B.MSSN = A.MSSN WHERE A.SSN = empSsn; DELETE FROM `Employee` WHERE SSN = empSsn; ELSE CALL my_signal('Error: Not a valid row!'); END IF; END//
Я прочитал здесь, что использование эффективного соединения эффективно для эффективного SELECT. Но моя проблема включает только одну таблицу, и я чувствую, что мое решение (первое) намного эффективнее второго, потому что соединение будет потреблять память сравнительно.
Пожалуйста, предложите мне, который лучше и эффективнее, если Employee table
достаточно большой. Что лучше для меня? Причина
EDIT: Я проверил небольшую таблицу, состоящую только из 7 строк, и оба решения принимают одинаковое время.
mysql> CALL delete_employee(4);
Query OK, 1 row affected (0.09 sec)
Я знаю, что функция SQL ведет себя недетерминированно, потому что эвристика таблицы. Какой выбор лучше? Либо если у вас есть идея, как можно оптимизировать запрос.