我有3张桌子:牙医,小组和groupdentlink。许多牙医通过groupdentlink表链接到许多组。
所以我正在尝试进行查询,它会将行插入到groupdentlink中(将状态中的所有牙医与州内的所有组相关联),但前提是这些行尚未存在。简而言之,我想添加新行而不覆盖现有行或复制它们。
因此查询的 intent 类似于:
INSERT INTO groupdentlink (f_dent_id, f_group_id, f_schedule_id)
VALUES ('$_POST[id]', '$groupid', '$scheduleid')
WHERE NOT EXISTS ('$_POST[id]', '$groupid')
我在groupdentlink表中没有任何主键。
提前谢谢!
答案 0 :(得分:20)
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为您处理此问题,您应该在两列的组合集上添加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
将尝试向您的表中插入一行,如果由于键约束而失败,则表示没有任何操作。
答案 1 :(得分: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 :(得分: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'
)
答案 3 :(得分: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)。