2011-12-15 58 views
7

我有3個表格:牙醫,團體和groupdentlink。許多牙醫通過groupdentlink錶鏈接到許多小組。插入不存在的地方 - 沒有主鍵

所以我試圖做一個查詢,它將插入行到groupdentlink(鏈接所有牙醫在狀態中的所有組)狀態,但只有當這些行不存在。簡而言之,我想添加新行而不覆蓋現有的或複製它們。

所以查詢的意圖是一樣的東西:

INSERT INTO groupdentlink (f_dent_id, f_group_id, f_schedule_id) 
VALUES ('$_POST[id]', '$groupid', '$scheduleid') 
WHERE NOT EXISTS ('$_POST[id]', '$groupid') 

而且我沒有在groupdentlink表中的任何主鍵。

預先感謝您!

回答

18

如果你真的想編寫自己的(工作)查詢..


INSERT INTO groupdentlink (
    f_dent_id, f_group_id, f_schedule_id 
) SELECT 
    '$_POST[id]' f_dent_id, 
    '$groupid' f_group_id, 
    '$scheduleid' f_schedule_id 
FROM DUAL 
WHERE NOT EXISTS (
    SELECT 1 
    FROM `groupdentlink` 
    WHERE 
    f_dent_id = '$_POST[id]' AND f_group_id = '$groupid' 
    LIMIT 1 -- will stop mysql to stop searching after first match 
) 

...但MySQL能夠處理所有這一切爲您服務!


你並不需要主鍵使MySQL處理這個適合你,你應該對合集中的兩列中添加一個UNIQUE鍵約束。

查詢將唯一密鑰dent_group_uniq_key添加到groupdentlink

ALTER TABLE groupdentlink ADD UNIQUE KEY `dent_group_uniq_key` (
    f_dent_id, f_group_id 
); 

然後在查詢中使用INSERT IGNORE

INSERT IGNORE INTO groupdentlink (
    f_dent_id, f_group_id, f_schedule_id 
) VALUES (
    '$_POST[id]', '$groupid', '$scheduleid' 
) 

INSERT IGNORE將嘗試插入一行到表,如果它失敗,因爲一個關鍵的制約它會像沒有發生。

2

你已經差不多了!您可以使用select語句來提供插入語句。只是這樣做:

INSERT INTO groupdentlink (f_dent_id, f_group_id, f_schedule_id) 
SELECT '$_POST[id]', '$groupid', '$scheduleid' 
WHERE 
    NOT EXISTS (
    select 
     1 
    from 
     groupdentlink 
    where 
     f_dent_id = $_POST[id] 
     and f_group_id = '$groupid' 
    ) 
+0

嗯。這裏是我的問題:「INSERT INTO groupdentlink(f_dent_id,f_group_id,f_schedule_id) \t SELECT '$ _ POST [ID]', '$ rowv [ID]', '$行[f_sched_id]' \t WHERE \t NOT EXISTS( \t SELECT 1 FROM groupdentlink WHERE f_dent_id = '$ _ POST [ID]' AND f_group_id = '$ GROUPID'」 ...和我得到一個語法錯誤 – 2011-12-15 19:40:50

+0

您需要關閉括號上存在的條款。 – Eric 2011-12-15 19:48:56

+0

...修正了那個,仍然沒有工作哦:( – 2011-12-15 20:06:58

4
INSERT INTO groupdentlink (f_dent_id, f_group_id, f_schedule_id) 
SELECT '$_POST[id]', '$groupid', '$scheduleid' FROM dual 
WHERE NOT EXISTS (
    select * from groupdentlink 
    where f_dent_id='$_POST[id]' 
    and f_group_id='$groupid' 
) 

我想你可以創建組合(f_dent_id,f_group_id)複合主鍵,以確保公正。

1
INSERT INTO groupdentlink (f_dent_id, f_group_id, f_schedule_id) 
VALUES ('$_POST[id]', '$groupid', '$scheduleid') 
WHERE NOT EXISTS (
    select * from groupdentlink 
    where f_dent_id='$_POST[id]' 
    and f_group_id='$groupid' 
) 

我想你可以在組合(f_dent_id,f_group_id)上創建一個組合主鍵。