sql >> Database >  >> RDS >> Mysql

MySQL-trigger voor het controleren van waarden voordat meerdere keren wordt ingevoegd

Functionaliteit als de CHECK Constraints van andere producten zou in dit specifieke geval geschikt zijn, maar MySQL ondersteunt deze functie niet. Meestal worden triggers vaak gebruikt om te bereiken wat je nodig hebt.

In het volgende voorbeeld, heel eenvoudig, worden alle kolommen gevalideerd op de trigger en wanneer u 50 records probeert in te voegen, duurt dit enkele milliseconden. Dit is slechts een proof of concept en het zou handig zijn om een ​​test uit te voeren in een productie-achtige omgeving.

/*Table structure for table `table_variables` */

DROP TABLE IF EXISTS `table_variables`;

CREATE TABLE `table_variables` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `variable0` TINYINT(4) DEFAULT NULL,
  `variable1` TINYINT(4) DEFAULT NULL,
  `variable2` TINYINT(4) DEFAULT NULL,
  `variable3` TINYINT(4) DEFAULT NULL,
  `variable4` TINYINT(4) DEFAULT NULL,
  `variable5` TINYINT(4) DEFAULT NULL,
  `variable6` TINYINT(4) DEFAULT NULL,
  `variable7` TINYINT(4) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB;

/* Trigger structure for table `table_variables` */

DELIMITER $$

/*!50003 DROP TRIGGER*//*!50032 IF EXISTS */ /*!50003 `trg_check_bi` */$$

CREATE TRIGGER `trg_check_bi` BEFORE INSERT ON `table_variables`
FOR EACH ROW
BEGIN
    DECLARE msg VARCHAR(255);
    DECLARE _min, _max TINYINT DEFAULT -49;
    SET _max := _max * (-1);
    SET @max = _max;
    IF (new.`variable0` NOT BETWEEN _min AND _max) THEN
        SET msg := 'Error: variable0 out of range.';
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
    END IF;
    IF (new.`variable1` NOT BETWEEN _min AND _max) THEN
        SET msg := 'Error: variable1 out of range.';
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
    END IF;
    IF (new.`variable2` NOT BETWEEN _min AND _max) THEN
        SET msg := 'Error: variable2 out of range.';
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
    END IF;
    IF (new.`variable3` NOT BETWEEN _min AND _max) THEN
        SET msg := 'Error: variable3 out of range.';
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
    END IF;
    IF (new.`variable4` NOT BETWEEN _min AND _max) THEN
        SET msg := 'Error: variable4 out of range.';
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
    END IF;
    IF (new.`variable5` NOT BETWEEN _min AND _max) THEN
        SET msg := 'Error: variable5 out of range.';
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
    END IF;
    IF (new.`variable6` NOT BETWEEN _min AND _max) THEN
        SET msg := 'Error: variable6 out of range.';
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
    END IF;
    IF (new.`variable7` NOT BETWEEN _min AND _max) THEN
        SET msg := 'Error: variable7 out of range.';
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
    END IF;
END $$

DELIMITER ;

INSERT `table_variables` (
    `variable0`,
    `variable1`,
    `variable2`,
    `variable3`,
    `variable4`,
    `variable5`,
    `variable6`,
    `variable7`)
VALUES
    (25, 46, 6, 42, 46, -42, -6, 47),
    (11, -37, 26, -3, -44, 37, -28, -4),
    (14, 33, -21, 40, 19, 23, 10, 29),
    (-32, 1, -47, 10, 42, 36, 5, -34),
    (-38, -40, -35, -6, 27, 7, 4, -49),
    (-14, 29, 41, -29, -23, 22, 31, 41),
    (-34, -49, 5, 27, -27, 30, -14, -11),
    (36, -30, -14, -27, -44, 10, 33, -12),
    (-10, 34, -42, 29, 29, 10, 11, -21),
    (6, 45, -36, 29, 7, -3, 13, 25),
    (37, -35, -40, -47, 32, -42, 38, -27),
    (-4, 12, 24, 36, -39, 41, -22, 12),
    (-19, 14, -18, 16, -15, 27, 31, 28),
    (-3, -49, 11, -44, -8, 42, -8, -21),
    (-31, -44, 21, -6, -42, -47, 38, -11),
    (-21, -23, -1, 17, 36, -16, -40, -3),
    (-43, 40, -16, 48, 43, 22, 29, 32),
    (25, -21, -32, -47, 6, 28, -28, 23),
    (-45, -48, 42, 11, -22, 4, 36, 24),
    (-39, -21, -34, 39, -47, -10, 46, 16),
    (-10, -48, 37, -15, -37, 8, 5, -47),
    (-4, -25, 32, -8, 11, 31, -25, 26),
    (-40, -30, 20, 44, 12, -22, -1, 16),
    (32, -33, -14, -22, -19, 20, 13, -43),
    (-10, 31, 39, -44, 8, 23, 44, 3),
    (32, 3, -31, -15, -32, 34, 20, 47),
    (30, -42, 44, 5, 41, 43, 44, 43),
    (32, -16, -31, 43, -34, 45, -14, 37),
    (-15, -38, 3, -17, -46, -31, 33, 12),
    (13, -22, 0, 18, 42, 9, -31, -33),
    (-23, 32, -16, -27, -38, 38, -40, 30),
    (26, -9, 23, -4, -38, -31, 9, -11),
    (-31, 25, -24, 48, -30, 48, -10, -47),
    (41, 1, 31, 4, -21, 30, -33, -9),
    (8, 16, 7, 39, 25, -38, -23, -47),
    (-18, 1, 13, 13, -25, -14, -43, -25),
    (-47, -11, 38, -23, 15, 0, 3, -31),
    (-20, 44, 37, 4, -40, 33, 39, 47),
    (-29, -40, 35, -46, 6, 21, 41, -4),
    (4, -16, -42, -16, -1, -6, 23, -13),
    (14, -40, 5, 0, 32, 16, 34, -24),
    (24, 45, 7, -49, -22, -12, -43, -29),
    (32, 1, -41, 38, -28, -11, -17, -5),
    (-21, -39, 13, 37, -1, 32, 17, 40),
    (-1, 25, -20, -26, -22, 18, 8, 37),
    (13, 4, 32, 1, -41, 36, -38, 47),
    (4, 26, -29, 25, -33, 5, -24, 15),
    (-1, -1, 47, -4, -15, -11, 36, -29),
    (-9, -7, 42, -14, -48, 47, 39, 3),
    (-31, -20, 91, 17, -89, 4, -14, 22);



  1. Een AWS Postgres RDS-tabel exporteren naar AWS S3

  2. Salesforce SOQL van SQL Server

  3. Zoeken in Microsoft Access-gegevens met Elasticsearch

  4. Selecteer Meerdere ID's uit een tabel