MySQL ट्रिगर-एक चर में एक SELECT का संग्रह करना




triggers (4)

मेरे पास एक ट्रिगर है जिसमें मुझे एक वेरिएबल है जो एक INT को एक SELECT से मिलता है, इसलिए मैं इसे दो IF स्टेटमेंट में उपयोग कर सकते हैं बजाय SELECT दो बार कॉल करने के बजाय। आप MySQL में चर को कैसे घोषित / उपयोग करते हैं?


आप MySQL में स्थानीय चर घोषित कर सकते हैं, DECLARE वाक्यविन्यास के साथ।

यहां एक उदाहरण है:

DROP TABLE IF EXISTS foo;
CREATE TABLE FOO (
  i SERIAL PRIMARY KEY
);

DELIMITER //
DROP TRIGGER IF EXISTS bar //

CREATE TRIGGER bar AFTER INSERT ON foo
FOR EACH ROW BEGIN
  DECLARE x INT;
  SET x = NEW.i;
  SET @a = x; -- set user variable outside trigger
END//

DELIMITER ;

SET @a = 0;

SELECT @a; -- returns 0

INSERT INTO foo () VALUES ();

SELECT @a; -- returns 1, the value it got during the trigger

जब आप किसी वैरिएबल के लिए एक मान निर्दिष्ट करते हैं, तो आपको यह सुनिश्चित करना होगा कि क्वेरी केवल एक मान देता है, पंक्तियों का एक सेट या स्तंभ का एक सेट नहीं। उदाहरण के लिए, यदि आपकी क्वेरी व्यवहार में एक भी मान लौटाती है, तो ठीक है लेकिन जैसे ही यह एक से अधिक पंक्ति लौटता है, आपको " ERROR 1242: Subquery returns more than 1 row "

आप यह सुनिश्चित करने के लिए कि स्थानीय वैरिएबल एकल मान पर सेट है LIMIT या MAX() का उपयोग कर सकते हैं

CREATE TRIGGER bar AFTER INSERT ON foo
FOR EACH ROW BEGIN
  DECLARE x INT;
  SET x = (SELECT age FROM users WHERE name = 'Bill'); 
  -- ERROR 1242 if more than one row with 'Bill'
END//

CREATE TRIGGER bar AFTER INSERT ON foo
FOR EACH ROW BEGIN
  DECLARE x INT;
  SET x = (SELECT MAX(age) FROM users WHERE name = 'Bill');
  -- OK even when more than one row with 'Bill'
END//

मैं इस समाधान को पोस्ट कर रहा हूं क्योंकि मुझे अपनी जरूरत के मुताबिक एक कठिन समय मिला है। यह पोस्ट मुझे पास पर्याप्त (1 धन्यवाद के लिए धन्यवाद), और डेटा डालने से पहले कॉलम डेटा को फिर से संगठित करने के लिए अंतिम समाधान है यदि डेटा एक परीक्षण से मेल खाता है

ध्यान दें: यह एक विरासत परियोजना से है जिसे मैं विरासत में मिला है:

  1. अनन्य कुंजी एक rridprefix + rrid
  2. इससे पहले कि मैं पदभार संभाला था, वहां डुप्लिकेट अनूठी कुंजियों को रोकने में कोई बाधा नहीं थी
  3. हमें मुख्य तालिका में दो तालिकाओं (एक पूर्ण डुप्लिकेट) को जोड़ना पड़ता था, जो अब समग्र कुंजी पर बाधा है (इसलिए विलय विफल हो जाता है क्योंकि प्राप्त टेबल अशुद्ध टेबल से डुप्लिकेट की अनुमति नहीं देगा)
  4. on duplicate key आदर्श से कम है क्योंकि स्तंभ बहुत अधिक हैं और बदल सकते हैं

वैसे भी, यह ट्रिगर है जो किसी लीपसी कॉलम में किसी भी डुप्लिकेट कुंजियां डालता है, जबकि हमें लीगेसी, खराब डेटा को संग्रहित करने की इजाजत देता है (और प्राप्त तालिकाओं की समग्र, अद्वितीय कुंजी को ट्रिगर नहीं)

BEGIN
  -- prevent duplicate composite keys when merging in archive to main
  SET @EXIST_COMPOSITE_KEY = (SELECT count(*) FROM patientrecords where rridprefix = NEW.rridprefix and rrid = NEW.rrid);

  -- if the composite key to be introduced during merge exists, rearrange the data for insert
  IF @EXIST_COMPOSITE_KEY > 0
  THEN

    -- set the incoming column data this way (if composite key exists)

    -- the legacy duplicate rrid field will help us keep the bad data
    SET NEW.legacyduperrid = NEW.rrid;

    -- allow the following block to set the new rrid appropriately
    SET NEW.rrid = null;

  END IF;

  -- legacy code tried set the rrid (race condition), now the db does it
  SET NEW.rrid = (
    SELECT if(NEW.rrid is null and NEW.legacyduperrid is null, IFNULL(MAX(rrid), 0) + 1, NEW.rrid)
    FROM patientrecords
    WHERE rridprefix  = NEW.rridprefix
  );
END

CREATE TRIGGER clearcamcdr AFTER INSERT ON `asteriskcdrdb`.`cdr` 
FOR EACH ROW
BEGIN
  SET @INC = (SELECT sip_inc FROM trunks LIMIT 1);
  IF NEW.billsec >1 AND NEW.channel LIKE @INC 
    AND NEW.dstchannel NOT LIKE "" 
  THEN
    insert into `asteriskcdrdb`.`filtre` (id_appel,date_appel,source,destinataire,duree,sens,commentaire,suivi) 
      values (NEW.id,NEW.calldate,NEW.src,NEW.dstchannel,NEW.billsec,"entrant","",""); 
  END IF;
END$$

इस @ घर की कोशिश न करें


`CREATE TRIGGER `category_before_ins_tr` BEFORE INSERT ON `category`
  FOR EACH ROW
BEGIN
    **SET @tableId= (SELECT id FROM dummy LIMIT 1);**

END;`;






triggers