【问题标题】:Making a Conditional MySQL Insert statement制作条件 MySQL 插入语句
【发布时间】:2013-01-29 14:10:56
【问题描述】:

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

  • REALM_KEY
  • ROLE_KEY
  • FUNCTION_KEY

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

我已经在看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

【问题讨论】:

    标签: mysql sakai


    【解决方案1】:
    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);
    

    希望对您有所帮助...

    【讨论】:

    • 不要认为这在语法上是有效的。它需要是INSERT INTO .... SELECT 248620, 8, 308 FROM .... WHERE NOT EXISTS.....
    • INSERT 语句本身没有 WHERE 子句。
    • 是的,我在想别的事,抱歉
    • 我明天上班一定要看看。谢谢!
    【解决方案2】:

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

    具有少量条目的架构:

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

    【讨论】:

      【解决方案3】:

      如果您定义了正确的索引,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`
      

      【讨论】:

        猜你喜欢
        • 2018-09-25
        • 2012-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-18
        • 1970-01-01
        • 1970-01-01
        • 2015-05-30
        相关资源
        最近更新 更多