【问题标题】:Delete a row from a table which contains the primary key从包含主键的表中删除一行
【发布时间】:2016-04-23 09:51:45
【问题描述】:

我有两个名为 distance 和 place 的 MySQL 表,如下所示:

距离

╔════╦══════╦═══════╗
║ id ║ name ║ point ║
╠════╬══════╬═══════╣
║ 1  ║ Call ║   A   ║
║ 2  ║ Foo  ║   B   ║
╚════╩══════╩═══════╝

地点

╔═══════╦═════════╗
║ point ║ address ║
╠═══════╬═════════╣
║   A   ║  ABCD   ║
║   B   ║  CDEF   ║
╚═══════╩═════════╝

'id' 是'distance' 表的主键,'point' 是'place' 表的主键。 “point”是“place”表引用的“distance”表的外键。
我想从 'place' 表中删除点 'A' 的行,即 id 等于 '1'。由于此外键是使用“on delete cascade constraint”创建的,因此也应删除位置表的相关行。 (也就是说,根据下表,应该删除距离表的第一行和地点表的第一行)。

这是我迄今为止在 PHP 代码下尝试过的查询:

mysql_query("delete p.point from place p where p.point IN SELECT * FROM (SELECT d.point FROM distance d GROUP BY d.point where d.id='1' )");

但是,这不会删除行。没有错误信息。 谁能帮我解决这个问题?

【问题讨论】:

  • mysql_query 会根据您的 PHP 版本进行折旧/删除 - 查看PDO 或 MySQLi

标签: php mysql


【解决方案1】:

尝试这样做

DELETE FROM place p
WHERE p.point IN (SELECT d.point 
                  FROM distance d 
                 WHERE d.id=1)

所以 PHP Query 应该是这样的

mysql_query('DELETE FROM place p WHERE p.point IN (SELECT d.point FROM distance d WHERE d.id=1)')

您所做的 Sub-Sub Select 可能没有返回任何值,因此不会执行任何操作并且不会给出错误,因为查询已正确完成。

【讨论】:

    【解决方案2】:

    试试这个:-

    DELETE p.* FROM place p
    INNER JOIN distance d ON p.point = d.point
    WHERE d.id = 1;
    

    【讨论】:

    • 虽然这可以回答问题,但最好提供一些关于此代码如何提供帮助的解释。
    • 如果您认为此答案有用,请标记为有用。
    【解决方案3】:

    您在WHERE IN 语句中使用*。如果你想使用WHERE IN,你只需要选择id。这是您的固定代码:

    mysql_query("delete p from place p where p.point IN (SELECT p.point FROM (SELECT d.point FROM distance d GROUP BY d.point where d.id='1' ))");
    

    但我不明白为什么在你可以这样做时使用两个选择

    mysql_query("delete p from place p where p.point IN (SELECT d.point FROM distance d GROUP BY d.point where d.id='1' )");
    

    【讨论】:

      【解决方案4】:

      尝试在您的DELETE 查询中使用INNER JOIN:

      DELETE p FROM place p
      INNER JOIN distance d ON p.point = d.point
      WHERE (d.id = 1);
      

      【讨论】:

      • 我认为你不需要DELETE p.* 它可能只是DELETE p from ...
      【解决方案5】:

      解决方案1: 您在查询中的 in 子句后缺少“(”。

      解决方案2:更好的选择是加入-

      delete pl.* from place pl 
      join distance dst on dst.point=pl.point 
      where d.id=1;
      

      解决方案 3:最好的选择是从父表中删除,并且所有相关行都将自动从子表中删除,因为您正在使用删除级联功能。

      DELETE FROM place WHERE `point`='A';
      

      【讨论】:

        猜你喜欢
        • 2012-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-06
        • 2014-03-18
        相关资源
        最近更新 更多