Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.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
Php 根据类层次结构更新或删除sql表中的行_Php_Mysql_Sql_Sql Update_Sql Delete - Fatal编程技术网

Php 根据类层次结构更新或删除sql表中的行

Php 根据类层次结构更新或删除sql表中的行,php,mysql,sql,sql-update,sql-delete,Php,Mysql,Sql,Sql Update,Sql Delete,更新和删除数据库中属于不同类(表)的行的最佳方法是什么?考虑表人和学生,其中学生是人和学生的子类。ID是指人。ID person: id | name student: id | number 删除 例如,如果必须删除所有学号小于100且姓名为空的人,可以使用如下查询 DELETE FROM person WHERE person.id IN ( SELECT person.id FROM person JOIN student ON person.id = student.id

更新和删除数据库中属于不同类(表)的行的最佳方法是什么?考虑表<代码>人<代码>和<代码>学生<代码>,其中学生是人和学生的子类。ID是指人。ID

person:  id | name
student: id | number
删除

例如,如果必须删除所有学号小于100且姓名为空的人,可以使用如下查询

DELETE FROM person WHERE person.id IN (
    SELECT person.id FROM person JOIN student ON person.id = student.id
        WHERE person.name = "" AND student.number < 100
)

一种可能的方法是(在php和事务中)使用select查询检索所有匹配的行id,然后使用修改的where子句分别更新每个表:
where id in($list of_id)
。然而,这似乎是一个次优的解决方案。如何有效地解决此问题?

@HaveNoDisplayName如何使用触发器更新这些表?数据库中是否必须有冗余数据?看起来这更像是一个设计缺陷,而不是一个实际的sqlquestion@MichaelKunst您指的是哪些冗余数据?我正在考虑任何类型的数据,其中不同的表表示类层次结构,示例仅用于说明。为了澄清这个问题,我对这个问题进行了一些更新。对于更新,您可以在一个存储过程中进行两次更新
UPDATE person JOIN student ON person.id = student.id
    SET person.name = "test", student.number = 0
    WHERE person.name = "" AND student.number > 10