Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何删除另一个表中主键作为外键引用的表中的记录?_Mysql_Sql_Database - Fatal编程技术网

Mysql 如何删除另一个表中主键作为外键引用的表中的记录?

Mysql 如何删除另一个表中主键作为外键引用的表中的记录?,mysql,sql,database,Mysql,Sql,Database,在我的数据库中,有一个名为“employee”的表,它有一个主键属性“employee_id”和另一个属性“salary”。 还有一个表是“employee_qualification”,它具有外键属性“employee_id”。 那么,如何删除工资=10000的“员工”和“员工资格”中的所有记录 这似乎不起作用 从employee.salary=10000的员工中删除您可以执行两条语句 DELETE FROM employee_qualifications WHERE employee_qua

在我的数据库中,有一个名为“employee”的表,它有一个主键属性“employee_id”和另一个属性“salary”。 还有一个表是“employee_qualification”,它具有外键属性“employee_id”。 那么,如何删除工资=10000的“员工”和“员工资格”中的所有记录

这似乎不起作用


从employee.salary=10000的员工中删除

您可以执行两条语句

DELETE FROM employee_qualifications WHERE employee_qualifications.employee_id in (SELECT employee_id FROM employee WHERE employee.salary=10000)
DELETE FROM employee WHERE employee.salary=10000
虽然这会起作用,但它可能会在employee_资格表中留下一些孤立的记录。下面的选项将清除孤立记录

DELETE FROM employee WHERE employee.salary=10000
DELETE FROM employee_qualifications WHERE employee_qualifications.employee_id Not in (SELECT employee_id FROM employee)

您可以执行两条语句

DELETE FROM employee_qualifications WHERE employee_qualifications.employee_id in (SELECT employee_id FROM employee WHERE employee.salary=10000)
DELETE FROM employee WHERE employee.salary=10000
虽然这会起作用,但它可能会在employee_资格表中留下一些孤立的记录。下面的选项将清除孤立记录

DELETE FROM employee WHERE employee.salary=10000
DELETE FROM employee_qualifications WHERE employee_qualifications.employee_id Not in (SELECT employee_id FROM employee)

MySQL允许同时删除多个表。因此,您可以:

DELETE e, eq
    FROM employee e JOIN
         employee_qualitifications eq
    WHERE e.employee_id = eq.employee_id AND
          e.salary = 10000;

MySQL允许同时删除多个表。因此,您可以:

DELETE e, eq
    FROM employee e JOIN
         employee_qualitifications eq
    WHERE e.employee_id = eq.employee_id AND
          e.salary = 10000;

使用(例如)配置架构,或者首先手动删除依赖记录。(我更喜欢后者,尽管它看起来需要更多的工作:它也更容易控制和明确。)我在google的某个地方遇到了DELETE CASCADE上的
,但这到底要写在哪里?请参阅上面的链接-它用于配置依赖表的外键定义。使用(例如)配置模式或者先手动删除从属记录。(我更喜欢后者,尽管它看起来更容易操作:它也更容易控制和明确。)我在google的某个地方遇到了DELETE CASCADE上的
,但这到底要写在哪里?请参见上面的链接-它用于配置依赖表的外键定义。这很巧妙。它是否也意味着一个[隐式]事务?@user2864740。这可能取决于所使用的存储引擎。InnoDB在一个事务中进行删除,我希望多表删除也是如此。这很巧妙。它是否也意味着一个[隐式]事务?@user2864740。这可能取决于所使用的存储引擎。InnoDB在单个事务中进行删除,我希望多表删除也是如此。。因此,当使用DRI时,MySQL中永远不会有孤立记录。要防止“孤立”(确保从主表中删除行时删除不会失败),请使用适当的事务。即使在支持延迟检查的数据库中,如果没有适当的保护,操作仍然可能失败(在提交时)。。因此,当使用DRI时,MySQL中永远不会有孤立记录。要防止“孤立”(确保从主表中删除行时删除不会失败),请使用适当的事务。即使在支持延迟检查的数据库中,如果没有适当的保护,操作仍然可能失败(在提交时)。