制作条件MySQL插入语句

时间:2013-02-13 21:34:22

标签: mysql sakai

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

  • REALM_KEY
  • ROLE_KEY
  • FUNCTION_KEY

这句话需要做的是,如果某个ROLE_KEY&的两个组合每个REALM_KEY都不存在FUNCTION_KEY,而不是插入。

我已经看了this StackOverflow post

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

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

3 个答案:

答案 0 :(得分: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);

希望有帮助...

答案 1 :(得分: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选择其他2列的所有REALM_KEY值和静态值。如果值已存在,则忽略它们。否则,它们将与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

Here's a demo

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

ALTER TABLE SAKAI_REALM_RL_FN DROP KEY `idx_unique_realm_role_function`

答案 2 :(得分: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);