iT邦幫忙

3

mysql 刪除沒有該條件的資料?以及從其他資料表更新該資料表的值到另一個資料表?

  • 分享至 

  • xImage

問題
A資料表欄位為 post_id
B資料表的欄位為 url
A跟B都有很多資料
A跟B有些 post_id 跟 url 是相符的 ,有些是不相符的 (A跟B有關聯性的欄位是 post_id 跟 url )
如何把不相符的都刪除?只留下有關聯性的

DELETE a, b FROM   
`a`   
JOIN `b` ON b.ID != a.post_id

這樣卻失敗了....?

mariaDB 報錯誤:#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'JOIN b ON b.ID != a.post_id' at line 3

然後又說

a, b 這一段是預期以外的符號?

PS:

  • 1.我要刪的是兩個資料表,只要都有不符合就刪除該筆
  • 2.我確定有 SELECT 到非常多不相符的數據,也有相符的數據。
    1. a 的 post_id 有多個,例如 b.ID 假如等於 123 那 a.post_id 有一個或多個123
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

2
石頭
iT邦高手 1 級 ‧ 2018-09-23 03:28:11
最佳解答

首先mysql 沒有一次delete 兩表語法

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]

所以你的 DELETE a, b FROM ... 是無效的語法


這個問題和兩個變數交換值一樣的概念,

你需要使用一張臨時表存取其中一表(AB)的資料.

先刪除其中一張表 之後再利用TempTable刪除另一張表

在這邊我會推薦使用 not exists 語法,因為看起來比較直觀

這裡是一個範例

Schema (MySQL v5.7)

CREATE TABLE A(
   post_id INT
);

INSERT INTO A VALUES (1);
INSERT INTO A VALUES (2);
INSERT INTO A VALUES (3);
INSERT INTO A VALUES (4);

CREATE TABLE B(
   ID INT
);

INSERT INTO B VALUES (2);
INSERT INTO B VALUES (3);
INSERT INTO B VALUES (35);
INSERT INTO B VALUES (36);

CREATE TEMPORARY TABLE IF NOT EXISTS temp1 AS (SELECT * FROM A);


DELETE FROM A
WHERE not exists (
  SELECT 1 
  FROM B
  WHERE B.ID = A.post_id  
);

DELETE FROM B
WHERE not exists (
  SELECT 1 
  FROM temp1 t1
  WHERE B.ID = t1.post_id  
);

Query #1

SELECT * FROM A;
post_id
2
3

Query #2

SELECT * FROM B;
ID
2
3

View on DB Fiddle

看更多先前的回應...收起先前的回應...
火爆浪子 iT邦研究生 1 級 ‧ 2018-09-23 10:47:33 檢舉

原來是這樣,所以這一大段是直接放 phpmyadmin 的SQL跑

火爆浪子 iT邦研究生 1 級 ‧ 2018-09-23 13:57:14 檢舉

temp1 是啥?

火爆浪子 iT邦研究生 1 級 ‧ 2018-09-23 14:05:38 檢舉

我把A跟B改成我對應的那個table名
我不知道是不是 A 有多個的關係?好像沒有動靜

火爆浪子 iT邦研究生 1 級 ‧ 2018-09-23 14:18:13 檢舉

可以用PHP做這件事嗎?可以從哪個思路下手

石頭 iT邦高手 1 級 ‧ 2018-09-23 16:20:31 檢舉

temp1 是啥?

temp1是我創立的臨時表 http://www.mysqltutorial.org/mysql-temporary-table/

石頭 iT邦高手 1 級 ‧ 2018-09-23 16:25:25 檢舉

我不知道是不是 A 有多個的關係?好像沒有動靜

你的 A 有多個的關係是什麼意思? 如果是有外鍵問題你需要提供所有資料表完整欄位資訊 我才能知道問題在哪

石頭 iT邦高手 1 級 ‧ 2018-09-23 16:26:53 檢舉

可以用PHP做這件事嗎?可以從哪個思路下手

這個是資料庫的事情XD, 不用也沒必要使用PHP.
直接在mysql engine上實作就好了

0
小魚
iT邦大師 1 級 ‧ 2018-09-23 07:45:47

話說,在SQL沒有 != 只有 <>

不過你的情況應該不能這樣做,
我想可能是這樣做不過沒有實際試過,

DELETE FROM `a` LEFT JOIN `b` ON b.ID = a.post_id WHERE `b`.ID IS NULL

如果不能直接刪除就要先把資料抓出來,
然後再刪除,
如果你兩邊都有資料可能要做兩次,
ab的角色互換再做一次.

看更多先前的回應...收起先前的回應...
火爆浪子 iT邦研究生 1 級 ‧ 2018-09-23 10:46:23 檢舉

我在哪看到都是教這種刪除方式 (stackoverflow...等等),真怪啊

小魚 iT邦大師 1 級 ‧ 2018-09-23 11:02:38 檢舉

我沒有去stackoverflow去看,
以我對資料庫的認識我覺得應該要這樣做,
不過你可以試著用你的方式去做,
也許你可以發現新大陸...吧?

火爆浪子 iT邦研究生 1 級 ‧ 2018-09-23 11:44:40 檢舉

或是直接在 php 上面做?

小魚 iT邦大師 1 級 ‧ 2018-09-23 12:11:59 檢舉

dog830228大大的語法也可以,
總之是要分兩次做.

火爆浪子 iT邦研究生 1 級 ‧ 2018-09-23 13:57:32 檢舉

我頭疼,每一筆都上萬筆,我想想怎麼做

我要發表回答

立即登入回答