【发布时间】:2012-11-11 05:12:27
【问题描述】:
这个问题是我的previous Question 要求在删除一行时更新同一个表。
我可以使用 Stored Procedure 而不是 trigger 或 nested-query 编写两个解决方案。
两者都使用辅助函数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 说,使用 join 对 Efficient SELECT 是有效的。但是我的问题只包括一个表,我觉得我的解决方案(第一个)比第二个更有效,因为 join 会比较消耗内存。
如果Employee table 足够大,请建议我哪个更好更高效。 哪个更适合我?原因
编辑:我检查了只包含 7 行的小表,两种解决方案都需要相同的时间。
mysql> CALL delete_employee(4);
Query OK, 1 row affected (0.09 sec)
我知道 SQL 函数的行为是不确定的,因为表启发式。哪个选择更好?如果您知道如何进一步优化查询。
【问题讨论】:
-
阅读本文 QUESTION
标签: mysql query-optimization mysql-5.0