1

所以我有这个名为 SAKAI_REALM_RL_FN 的表,它有 3 个字段

  • REALM_KEY
  • ROLE_KEY
  • FUNCTION_KEY

该语句需要做的是,如果每个 REALM_KEY 不存在 ROLE_KEY 和 FUNCTION_KEY 的某些 2 组合,则执行插入。

我已经在看这篇 StackOverflow 帖子了

我还有用于单数插入的查询:

INSERT INTO `sakai`.`SAKAI_REALM_RL_FN` (`REALM_KEY`, `ROLE_KEY`, `FUNCTION_KEY`) VALUES (248620, 8, 308);

伪代码:

if(ROLE_KEY equals 8 and FUNCTION_KEY=308 don't exist for REALM_KEYS)
    than insert ROLE_KEY=8 & FUNCTION_KEY=308
4

3 回答 3

3
INSERT INTO `sakai`.`SAKAI_REALM_RL_FN` (`REALM_KEY`, `ROLE_KEY`, `FUNCTION_KEY`)
SELECT *primaryKey*
FROM `sakai`.`SAKAI_REALM_RL_FN`
WHERE not exists (SELECT *primaryKey*
                  from `sakai`.`SAKAI_REALM_RL_FN`
                  where role_key = 8 and function_key = 308);

希望有帮助...

于 2013-02-13T21:41:36.787 回答
0

我不太确定你想要什么,但这里有一些你可能会觉得有用的东西。

具有少量条目的架构:

CREATE TABLE ALOHA (
  REALM_KEY VARCHAR(32) NOT NULL,
  ROLE_KEY VARCHAR(32) NOT NULL,
  FUNCTION_KEY VARCHAR(32) NOT NULL
  );

INSERT INTO ALOHA VALUES ('1', '1', '1');
INSERT INTO ALOHA VALUES ('1', '1', '2');
INSERT INTO ALOHA VALUES ('1', '2', '1');
INSERT INTO ALOHA VALUES ('1', '2', '2');
INSERT INTO ALOHA VALUES ('1', '2', '3');
INSERT INTO ALOHA VALUES ('1', '2', '4');

尝试插入 3 个条目(仅插入一个):

INSERT INTO ALOHA (REALM_KEY, ROLE_KEY, FUNCTION_KEY)
 SELECT * FROM (
  SELECT '1' AS REALM_KEY, '2' AS ROLE_KEY, '1' AS FUNCTION_KEY
  UNION ALL
  SELECT '1', '2', '3'
  UNION ALL
  SELECT '1', '2', '5'
 ) s 
 WHERE NOT EXISTS
  (SELECT 1 FROM ALOHA a
   WHERE a.ROLE_KEY = s.ROLE_KEY
   AND a.REALM_KEY = s.REALM_KEY
   AND a.FUNCTION_KEY = s.FUNCTION_KEY);
于 2013-02-13T22:20:15.470 回答
0

如果您定义正确的索引,RDBMS 可以很好地处理这个问题。

听起来您需要的是跨所有三列的复合UNIQUE索引。当您执行 时,如果组合尚不存在,则将插入该组合。INSERT IGNORE

请注意,如果您的表中已经有非唯一行,这将失败。

ALTER TABLE SAKAI_REALM_RL_FN ADD UNIQUE KEY `idx_unique_realm_role_function` (REALM_KEY, ROLE_KEY, FUNCTION_KEY)

然后INSERT选择REALM_KEY其他 2 列的所有值和静态值。如果这些值已经存在,它们将被忽略。否则它们将与REALM_KEY.

INSERT IGNORE INTO SAKAI_REALM_RL_FN (REALM_KEY, ROLE_KEY, FUNCTION_KEY) 
  /* SELECT within INSERT gets all REALM_KEY plus the 2 static values */
  SELECT 
    REALM_KEY, 
    8, 
    308
  FROM SAKAI_REALM_RL_FN

这是一个演示

完成 后INSERT IGNORE,您可以放弃 ,UNIQUE KEY因为它可能不再需要。

ALTER TABLE SAKAI_REALM_RL_FN DROP KEY `idx_unique_realm_role_function`
于 2013-02-13T21:41:28.800 回答