Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

एक मूल्य को mysql में नकारात्मक होने से रोकने का सबसे अच्छा तरीका

मैं क्वेरी के प्रदर्शन के बारे में कुछ नहीं कह सकता, क्षमा करें। लेकिन आप 'नए_बैलेंस' के मामले को कभी भी नकारात्मक होने से बचाने के लिए ट्रिगर्स पर विचार करना चाह सकते हैं। (क्योंकि यह मेरे लिए एक अशक्त-सम्मिलित करने के लिए अजीब है, यदि 'new_balance' $amount से कम है, लेकिन यह फिर भी काम कर सकता है :))।

देखें MySQL 5.0 का दस्तावेज़ विवरण के लिए ट्रिगर कैसे बनाएं।

मूल रूप से आप चेक डालेंगे, यदि NEW.new_balance पहले-ट्रिगर में ऋणात्मक है। यदि हां, तो आप ट्रिगर और INSERT-क्वेरी को निरस्त करने के लिए, निष्पादन में एक जानबूझकर त्रुटि "कार्रवाई रोकें" का उपयोग करेंगे। टिप्पणियों में उल्लिखित पृष्ठ पर विचार देखें।

अपडेट करें:थोड़ा इधर-उधर किया गया (घर पर MySQL स्थापित करने का मेरा बहाना)।

मेरे संस्करण में मनीलॉग में दर्ज प्रत्येक मूल्य के लिए डीबी को दूसरी बार लिखने की समस्या है।

शायद एक संग्रहित खरीद में स्विच करना उचित होगा। या किसी और के पास एक बेहतर विचार है, मैं डीबी में उतना नहीं हूँ :)

CREATE DATABASE triggertest;
CONNECT triggertest;

CREATE TABLE transferlog (
  account SMALLINT UNSIGNED NOT NULL ,
  amount INT NOT NULL,
  new_balance INT NOT NULL
) ENGINE=INNODB;

CREATE TABLE stopaction (
  entry CHAR(20) NOT NULL,
  dummy SMALLINT,
  UNIQUE(`entry`)
);

INSERT INTO stopaction (`entry`) VALUES ('stop');

DELIMITER #
CREATE TRIGGER nonneg_insert BEFORE INSERT ON transferlog
  FOR EACH ROW BEGIN
    INSERT INTO stopaction (`entry`)
      SELECT CASE WHEN NEW.new_balance<0 THEN 'stop'
                  ELSE 'none' END;
    DELETE FROM stopaction WHERE entry!='stop';
  END;
#

CREATE TRIGGER nonneg_update BEFORE UPDATE ON transferlog
  FOR EACH ROW BEGIN
    INSERT INTO stopaction (`entry`)
      SELECT CASE WHEN NEW.new_balance<0 THEN 'stop'
                  ELSE 'none' END;
    DELETE FROM stopaction WHERE entry!='stop';
  END;
#
DELIMITER ;


INSERT INTO transferlog (`account`, `amount`, `new_balance`)  
  VALUES (1, 1000, 1000);
INSERT INTO transferlog (`account`, `amount`, `new_balance`)
  VALUES (1, -1000, 0);
INSERT INTO transferlog (`account`, `amount`, `new_balance`)
  VALUES (1, -1000, -1000);
INSERT INTO transferlog (`account`, `amount`, `new_balance`)
  VALUES (1, 10, 20);
SELECT version();

DROP DATABASE triggertest;

शायद यह आपको सूट करे, INSERT-Lines के लिए मेरा आउटपुट है:

mysql> INSERT INTO transferlog (`account`, `amount`, `new_balance`)  VALUES (1, 1000, 1000);
Query OK, 1 row affected (0.03 sec)

mysql> INSERT INTO transferlog (`account`, `amount`, `new_balance`)  VALUES (1, -1000, 0);
Query OK, 1 row affected (0.02 sec)

mysql> INSERT INTO transferlog (`account`, `amount`, `new_balance`)  VALUES (1, -1000, -1000);
ERROR 1062 (23000): Duplicate entry 'stop' for key 1

mysql> INSERT INTO transferlog (`account`, `amount`, `new_balance`)  VALUES (1, 10, 20);
Query OK, 1 row affected (0.02 sec)

mysql> SELECT version();
+---------------------+
| version()           |
+---------------------+
| 5.0.67-community-nt |
+---------------------+
1 row in set (0.00 sec)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:LIKE . पर दो तालिकाओं में शामिल हों

  2. किसी अन्य mysql कॉलम में mysql मानों के आधार पर योग php सरणी (mysql परिणामों से निर्मित)

  3. MySQL संग्रहीत रूटीन में सरणी पास करें

  4. MySQL:एक प्रश्न में दो चीजें गिनें?

  5. PHP सारांश के बारे में पूछें 01 + 01 =02