2012-08-17 88 views
3

我是mysql新手。我在插入記錄表1如果table2.I不存在問題已經在形式2個表Table 1和Table:如果表2中不存在如何插入表1?

table1 

dep_id start  stop  modified deleted     
1  23456789 167921525 Yes  No 
2  34567812 345678145 Yes  No 
3  32789054 327890546 No  No 


table2 

start  stop  modified deleted     
23456789 167921525 No  No 
34567823 345678145 No  No 
32789053 727890546 No  No 

我試圖將值插入表1的啓動且僅當停止字段值它不存在於table2的「開始」和「停止」列中。如果存在,我需要拋出一個錯誤。 這些表沒有主鍵外鍵關係。 我很抱歉不知道正確的語法,但我必須在mysql和PHP中做這樣的事情。

Replace Into into table1 set 'start'=> $start,'stop' => $stop 
(select 'start','stop' from table2 where table1.start and table1.stop not in table2.start and table2.stop); 

如何查詢這2個表插入到Table前檢查Table1.start和Table1.stop領域不Table2.start和Table2.stop匹配嗎?

+0

我剛剛爲我的解決方案設置了一個SQLFiddle演示。嘗試一下。 – 2012-08-17 20:10:54

回答

3

你可以這樣做:

INSERT INTO table1 (start, stop) 
SELECT a.* 
FROM  (SELECT 123456789 start, 234567890 stop) a 
LEFT JOIN table2 b ON (a.start,a.stop) IN ((b.start,b.stop)) 
WHERE  b.start IS NULL 

123456789234567890是你的輸入值分別爲startstop

然後,您可以根據您使用的數據庫接口(PDO,mysqli等),使用rowCount或num_rows_affected檢查它。如果它是0,則不插入記錄,否則插入發生。


SQLFiddle Demo

+0

這就是我想要的! – user1028428 2012-08-17 21:26:07

+0

有沒有辦法參數化硬編碼值123456789和234567890 – Gacci 2017-07-10 16:44:02

0

我認爲這是你想要的。這需要兩個值,$啓動和$停止,只有不插入,如果它不表2中存在:

insert into table1 (start, stop) 
    select * 
    from (select $start as start, $stop as stop) t 
    where not exists (select 1 from table2 where start = $start and stop = $end) 
+0

我在ERROR 1064(42000)附近得到一個mysql錯誤:你的SQL語法有錯誤;檢查與您的MySQL服務器版本相對應的手冊,在第一行選擇* from(選擇168132540作爲開始,168132540作爲停止)在'1'附近使用正確的語法。我的mysql版本是mysql Ver 14.14 Distrib 5.1.56,for pc-linux-gnu(x86_64)使用readline 5.1 – user1028428 2012-08-17 17:57:55

+0

@ user1028428。 。 。我認爲你在輸入行結尾缺少別名「t」。 – 2012-08-17 18:12:30

+0

我加了,但仍然給我錯誤。錯誤1064(42000):您的SQL語法有錯誤;檢查與您的MySQL服務器版本相對應的手冊,以在'select * from(選擇168132540作爲開始,168132540作爲停止)'t' – user1028428 2012-08-17 18:22:10

0

隨着參數的值:

INSERT INTO table1 (start, stop) 
SELECT a.* 
FROM  (SELECT ? start, ? stop) a 
LEFT JOIN table2 b ON (a.start,a.stop) IN ((b.start,b.stop)) 
WHERE  b.start IS NULL 

這工作,但我們通過SQL語句做insert

現在,接口插入記錄的解決方案是什麼?這是沒有SQL語句,與問題中提出的限制。

相關問題