在不存在的地方插入-无主键

问题描述 投票:0回答:4

我有 3 个表:dentists、groups 和 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 表中没有任何主键。

提前谢谢您!

mysql primary-key overwrite
4个回答
24
投票

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


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
)

...但是 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
将尝试向表中插入一行,如果由于键约束而失败,它将表现得像什么都没发生一样。


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'
)

我认为您可以在组合(f_dent_id,f_group_id)上创建一个复合主键只是为了确保。


2
投票

你就快明白了!您可以使用 select 语句来提供 insert 语句。只需这样做:

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'
    )

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)上创建复合主键。

© www.soinside.com 2019 - 2024. All rights reserved.