这个问题的顺序是我的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) –