从包含主键

时间:2016-01-18 09:21:05

标签: php mysql

我有两个名为distanceplace的MySQL表,如下所示:

距离

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

地方

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

'id'是'distance'表的主键,'point'是'place'表的主键。 'point'是'distance'表的外键,由'place'表引用。
我想从'place'表中删除点'A'的行,其中 id 等于'1'。由于此外键是使用'on delete cascade constraint'创建的,因此还应删除place表的相关行。 (这意味着,根据下表,应删除距离表的第一行和地方表的第一行)。

这是我在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' )");

但是,这不会删除行。没有错误消息。 有人可以帮我解决这个问题吗?

5 个答案:

答案 0 :(得分:2)

尝试在INNER JOIN查询中使用DELETE

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

答案 1 :(得分:0)

您在*声明中使用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' )");

答案 2 :(得分:0)

解决方法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';

答案 3 :(得分:0)

尝试这样做

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可能没有返回任何值,因此没有进行任何操作并且没有给出错误,因为查询已正确完成。

答案 4 :(得分:0)

试试这个: -

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