我有两张桌子如下。下面提到的两个表中的Id列值都是自动递增的。
LoginInfo类
+----+------------+-------------+
| Id |
LoginName |
IP |
+------+----------+-------------+
| 1 |
User1 |
aa.bb.cc.dd|
| 2 |
User2 |
xx.xx.xx.xx|
| 3 |
User3 |
ii.ii.ii.ii|
+----+------------+-------------+
群组
+----+------------+-------------+
| Id |
LoginName |
Groups |
+------+----------+-------------+
| 1 |
User1 |
Group1 |
| 2 |
User1 |
Default |
| 3 |
User2 |
Group2 |
| 4 |
User3 |
Group3 |
+----+------------+-------------+
LoginInfo 表中的每个用户都应该是 UserGroups 表中“默认”组的成员。因此,在上表中,User1与“默认”组关联,但User2和User3不关联。
我想检查是否为 UserGroups 表中的每个用户添加了“默认”组条目。如果可用则忽略插入,否则为该用户插入新记录。
我试过的mysql查询是
INSERT IGNORE INTO USERGROUPS(LOGINNAME, GROUPS) SELECT LOGINNAME, 'Default' FROM LOGININFO L WHERE L.IP IS NOT NULL;
执行后,显示为3行的消息受影响, UserGroups 表显示为
+----+------------+-------------+
| Id |
LoginName |
Groups |
+------+----------+-------------+
| 1 |
User1 |
Group1 |
| 2 |
User1 |
Default |
| 3 |
User2 |
Group2 |
| 4 |
User3 |
Group3 |
| 5 |
User1 |
Default |
| 6 |
User2 |
Default |
| 7 |
User3 |
Default |
+----+------------+-------------+
但我真正想要的是如下
+----+------------+-------------+
| Id |
LoginName |
Groups |
+------+----------+-------------+
| 1 |
User1 |
Group1 |
| 2 |
User1 |
Default |
| 3 |
User2 |
Group2 |
| 4 |
User3 |
Group3 |
| 5 |
User2 |
Default |
| 6 |
User3 |
Default |
+----+------------+-------------+
请告知有关查询或任何变通方法的建议。
答案 0 :(得分:2)
您必须在执行INSERT IGNORE之前添加唯一约束:
ALTER TABLE UserGroups ADD UNIQUE (LoginName, Groups)
然后你可以执行这个查询:
INSERT IGNORE INTO USERGROUPS(LOGINNAME, GROUPS)
SELECT LOGINNAME, 'Default'
FROM LOGININFO
WHERE IP IS NOT NULL
请参阅此fiddle。
答案 1 :(得分:1)
您可以通过过滤掉重复记录的方式来构建SELECT
语句的INSERT
部分:
INSERT INTO UserGroups(LoginName, Groups)
SELECT LoginName, 'Default'
FROM LoginInfo AS l
WHERE l.IP IS NOT NULL
AND NOT EXISTS (SELECT 1
FROM UserGroups AS ug
WHERE ug.LoginName = l.LoginName AND ug.Groups = 'Default');
然后,您不需要使用IGNORE
。