2016-01-18 116 views
0

我有兩個MySQL表稱爲distanceplace如下:刪除行的主鍵

距離

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

地方

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

'id'是'distance'表的主鍵,'point'是主鍵'地方'表的。 'point'是'place'表引用的'distance'表的外鍵。
我想從'地點'表中刪除點'A'的行,這是ID等於'1'。由於這個外鍵是用'on delete cascade constraint'創建的,所以place table的相關行也應該被刪除。 (也就是說,根據下表,距離表的第一行和地點表的第一行應該被刪除)。

這是我迄今在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')"); 

但是,這並不刪除行。沒有錯誤消息。 任何人都可以請幫我解決這個問題嗎?

+1

'mysql_query'折舊/取決於你的PHP版本中刪除 - 看看[PDO](http://php.net/manual/en/ref.pdo -mysql.php)或[MySQLi](http://php.net/manual/en/book.mysqli.php) – Aravona

回答

0

試試這個: -

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

雖然這可以回答這個問題,但最好提供一些關於此代碼如何提供幫助的解釋。 – vard

+0

如果您認爲本答案有用馬克投票最多有用。 – Divakarcool

2

嘗試在DELETE查詢使用INNER JOIN

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

我不認爲你需要'DELETE p。*'它可能只是'DELETE p from .. 。 –

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')"); 
0

解決方法1: 您在缺少「(」後的條款查詢

溶液2:更好的選擇是join-

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

Solution3:最好的選擇將只是從父表中刪除,並且所有相關的行將從您的子級自動刪除,就像您在刪除級聯功能時使用的那樣。

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

嘗試這樣做

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

所以PHP查詢應該是這樣的

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

分次選擇你可能做的是一個沒有返回值,所以由於查詢已正確完成,因此不會執行任何操作,也不會發出錯誤。