這個問題的順序是我的previous Question需要更新刪除一行的同一個表。使用連接或順序哪個更新更快?
我可以使用存儲過程而不是觸發器或嵌套查詢來編寫兩個解決方案。
兩者都使用幫助函數my_signal(msg)。
從Employee
表中刪除員工的存儲過程。
- 拳頭解決方案:在表中使用
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//
我讀here,使用連接是有效的高效選擇。但是我的問題只包含一個表,我覺得我的解決方案(第一個)比第二個更有效,因爲連接會比較消耗內存。
如果Employee table
足夠大,請建議我哪個更好更高效。 哪個更適合我?原因
編輯:我檢查了只包含7行的小表,並且兩個解決方案都採用相同的時間。
mysql> CALL delete_employee(4);
Query OK, 1 row affected (0.09 sec)
我知道SQL函數行爲非確定性,因爲表啓發式。哪個選擇更好?要麼你有一些想法如何進一步優化查詢。
**閱讀本** [**問題**](http://stackoverflow.com/問題/ 13487010/how-to-update-same-table-on-deletion-in-mysql) –