1

だから私は3つのフィールドを持つSAKAI_REALM_RL_FNという名前のこのテーブルを持っています

  • REALM_KEY
  • ROLE_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

正しいインデックスを定義すれば、RDBMSはこれを処理するための設備が整っています。

必要なのは、 3つの列すべてUNIQUEにわたる複合インデックスのようです。を実行すると、その組み合わせがまだ存在しない場合は挿入されます。INSERT IGNORE

テーブルに一意でない行がすでにある場合、これは失敗することに注意してください。

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

次に、は他の2つの列のINSERTすべての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

これがデモです

を完了すると、不要になる可能性がINSERT IGNOREあるため、を削除できます。UNIQUE KEY

ALTER TABLE SAKAI_REALM_RL_FN DROP KEY `idx_unique_realm_role_function`
于 2013-02-13T21:41:28.800 に答える
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つのエントリを挿入してみてください(1つだけが挿入されます):

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 に答える