mysqlprimary-keyoverwrite

Insert Where Not Exists-Without Primary Key


I have 3 tables: dentists, groups, and groupdentlink. Many dentists link to many groups through the groupdentlink table.

So I'm trying to make a query where it will insert rows into groupdentlink (linking all dentists in the state with all the groups in the state) but only if those rows don't already exist. In a nutshell I want to add new rows without overwriting existing ones or duplicating them.

So the intent of the query is something like:

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

And I don't have any primary keys in the groupdentlink table.

Thank you in advance!


Solution

  • If you really want to write your own (working) query..


    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 -- tells mysql to stop searching after first match
    )
    

    ... but MySQL can handle all this for you!


    You don't need primary keys to make MySQL handle this for you, you should add a UNIQUE key constraint on the combined set of the two columns.

    Query to add the unique key dent_group_uniq_key to groupdentlink.

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

    Then use INSERT IGNORE on your query:

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

    INSERT IGNORE will try to insert a row to your table, if it fails due to a key constraint it will act like nothing happen.