插入不存在的位置 - 没有主键

Bri*_*rus 9 mysql overwrite primary-key

我有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')
Run Code Online (Sandbox Code Playgroud)

而且我在groupdentlink表中没有任何主键.

先感谢您!

Fil*_*efp 21

如果你真的想写自己的(工作)查询..


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
)
Run Code Online (Sandbox Code Playgroud)

...但MySQL可以为您处理所有这些!


你不需要主键让MySQL为你处理这个,你应该UNIQUE在两列的组合集上添加一个键约束.

查询添加唯一的密钥dent_group_uniq_keygroupdentlink.

ALTER TABLE groupdentlink ADD UNIQUE KEY `dent_group_uniq_key` (
  f_dent_id, f_group_id
);
Run Code Online (Sandbox Code Playgroud)

然后使用INSERT IGNORE您的查询:

INSERT IGNORE INTO groupdentlink (
  f_dent_id, f_group_id, f_schedule_id
) VALUES (
  '$_POST[id]', '$groupid', '$scheduleid'
)
Run Code Online (Sandbox Code Playgroud)

INSERT IGNORE 将尝试向您的表中插入一行,如果由于键约束而失败,它将表现得没有任何意义.


Gee*_*nte 5

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'
)
Run Code Online (Sandbox Code Playgroud)

我认为您可以在组合(f_dent_id,f_group_id)上创建复合主键,以确保.