在我的数据库中,我有一个Employee
具有递归关联的表(一个雇员可以是其他雇员的老板):
create table if not exists `employee` (
`SSN` varchar(64) not null,
`name` varchar(64) default null,
`designation` varchar(128) not null,
`MSSN` varchar(64) default null,
primary key (`ssn`),
constraint `fk_manager_employee` foreign key (`mssn`) references employee(ssn)
) engine=innodb default charset=latin1;
mysql> describe Employee;
+-------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| SSN | varchar(64) | NO | PRI | NULL | |
| name | varchar(64) | YES | | NULL | |
| designation | varchar(128) | NO | | NULL | |
| MSSN | varchar(64) | YES | MUL | NULL | |
+-------------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
然后插入:
mysql> insert into Employee values
-> ("1", "A", "OWNER", NULL),
-> ("2", "B", "BOSS", "1"),
-> ("3", "C", "WORKER", "2"),
-> ("4", "D", "BOSS", "2"),
-> ("5", "E", "WORKER", "4"),
-> ("6", "F", "WORKER", "1"),
-> ("7", "G", "WORKER", "4")
-> ;
Query OK, 7 rows affected (0.02 sec)
Records: 7 Duplicates: 0 Warnings: 0
现在我在表中的行之间具有以下层次关系(所有者>老板>工人):
A
/ \
B F
/ \
c D
/ \
G E
以下是表的Select语句:
mysql> SELECT * FROM Employee;
+-----+------+-------------+------+
| SSN | name | designation | MSSN |
+-----+------+-------------+------+
| 1 | A | OWNER | NULL |
| 2 | B | BOSS | 1 |
| 3 | C | WORKER | 2 |
| 4 | D | BOSS | 2 |
| 5 | E | WORKER | 4 |
| 6 | F | WORKER | 1 |
| 7 | G | WORKER | 4 |
+-----+------+-------------+------+
7 rows in set (0.00 sec)
现在,我想强加约束,如:If any employee (BOSS) deleted then new BOSS of workers under him become immediate BOSS of deleted employee (Old BOSS)
。例如,如果我删除,D
则B
成为G
和的老板E
。
为此,我还编写了一个 触发器 ,如下所示:
mysql> DELIMITER $$
mysql> CREATE
-> TRIGGER `Employee_before_delete` BEFORE DELETE
-> ON `Employee`
-> FOR EACH ROW BEGIN
-> UPDATE Employee
-> SET MSSN=old.MSSN
-> WHERE MSSN=old.MSSN;
-> END$$
Query OK, 0 rows affected (0.07 sec)
mysql> DELIMITER ;
但是当我执行一些删除时:
mysql> DELETE FROM Employee WHERE SSN='4';
ERROR 1442 (HY000): Can't update table 'Employee' in stored function/trigger
because it is already used by statement which invoked this stored
function/trigger.
我在这里学到这是this trigger is not possible
因为In MySQL triggers can't manipulate the table they are assigned to
。
还有 其他可行的方法吗? 有可能使用Nested Query
吗?有人可以建议我其他方法吗?一个建议就足够了,但应该是有效的。
编辑 :
我得到的答案:而不是触发一个stored procedure
或two consecutive queries
可能。
第一和第二。
我为这个问题写的解决方案如下, 工作正常! :
MYSQL version older then 5.5
。分隔符//
CREATE PROCEDURE `my_signal`(in_errortext VARCHAR(255)) BEGIN SET @sql=CONCAT('UPDATE `', in_errortext, '` SET x=1'); PREPARE my_signal_stmt FROM @sql; EXECUTE my_signal_stmt; DEALLOCATE PREPARE my_signal_stmt; END//
Employee
表中删除员工的存储过程。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//
定界符;
使用存储过程:
UPDATE b
SET b.mssn = a.mssn
FROM EMPLOYEE a
JOIN EMPLOYEE b ON b.mssn = a.ssn
WHERE a.ssn = @deletedBoss
DELETE FROM employee WHERE ssn = @deletedBoss
使用存储过程,您可以简单地删除所需的行,然后更新同一张表。那应该防止错误消息。
问题内容: 我有一张叫的桌子。 它包含名为和的字段。现在,我想从表中删除所有包含表中已经包含的名字和姓氏的记录。 我使用mysql数据库,并且是表中的主键。 问题答案: 删除之后,将删除所有重复项,并为您提供最新的CustomerID 虽然有警告提示。我不知道您的用例,但是完全可以让两个人使用完全相同的名字(我们甚至一次都具有相同的地址)。
问题内容: 我想将唯一键放到如何? 问题答案: 只需使用以下SQL脚本即可删除MySQL中的索引:
我使用Datatables将一些数据列在表中。我已经知道了如何在Datatables中使用delete行,但是我无法知道如何同时从MySQL数据库中进行delete。如果没有从中删除,刷新时将再次获得JSON文件,该文件将填充我的表。这是到目前为止我的代码:(我正在尝试获取按delete from的行的ID,将ID与数据库中的ID匹配,然后从数据库中删除该ID) 按下delete(删除)按钮时执行
我正在尝试使用query-更新行(删除列str_column中的连字符和连字符后的所有字符)- 但上面的查询是删除匹配的行而不是更新。 我不明白,如何更新查询可以删除行??
问题内容: 我有两个桌子和。表具有字段和其他几个字段。表具有3个字段: 是固定的值枚举。例如,它可以是,或。 我需要进行查询,其结果将是4列: ,对,对,对 如果不存在用于相应值在表然后NULL值应在相应的列中显示。 例: 结果应该是: 我尝试了3次左联接表,但无法弄清楚如何排列输出 问题答案: 您需要使用多个: 这是一个示例:SQL Fiddle。
我在MySQL中的查询有问题。我的表有4列,看起来如下所示: 和是来自不同表的外键。 我只想删除一行: 它出现了两次,所以我只想删除它。 我尝试了以下查询: 但它将删除这两个(因为它们是重复的)。有什么关于解决这个问题的提示吗?