Can't create triggers in MySQL, no errors but no triggers either I'm trying to create triggers without much success I'm not getting any error but the triggers don't show up either... So what's wrong with this?

USE `wa3`;

CREATE TABLE `transactions` (
    `id` CHAR(36) NOT NULL,
    `account_number` INT(11) NOT NULL,
    `transactions` INT(11) NOT NULL,
    `debit` DECIMAL(16,2) NULL DEFAULT NULL,
    `credit` DECIMAL(16,2) NULL DEFAULT NULL,
    `balance` DECIMAL(16,2) NOT NULL,
    `created` DATETIME NULL DEFAULT NULL,
    `modified` DATETIME NULL DEFAULT NULL,
    PRIMARY KEY (`id`)
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
;

DELIMITER //
CREATE TRIGGER `wa3`.`InsertCreditOrDebitNotNull` BEFORE INSERT ON `transactions`
FOR EACH ROW BEGIN
  IF (NEW.credit IS NULL AND NEW.debit IS NULL) THEN
    SIGNAL SQLSTATE '45000'
    SET MESSAGE_TEXT = '\'credit\' and \'debit\' cannot both be null';
  END IF;
END;
CREATE TRIGGER `wa3`.`UpdateCreditOrDebitNotNull` BEFORE UPDATE ON `transactions`
FOR EACH ROW BEGIN
  IF (NEW.credit IS NULL AND NEW.debit IS NULL) THEN
    SIGNAL SQLSTATE '45000'
    SET MESSAGE_TEXT = '\'credit\' and \'debit\' cannot both be null';
  END IF;
END;
DELIMITER ;

DELIMITER //
CREATE TRIGGER `wa3`.`InsertBothCreditAndDebit` BEFORE INSERT ON `transactions`
FOR EACH ROW BEGIN
  IF (NEW.credit IS NOT NULL AND NEW.debit IS NOT NULL) THEN
    SIGNAL SQLSTATE '45000'
    SET MESSAGE_TEXT = '\'credit\' and \'debit\' cannot both have a value';
  END IF;
END;
CREATE TRIGGER `wa3`.`UpdateBothCreditAndDebit` BEFORE UPDATE ON `transactions`
FOR EACH ROW BEGIN
  IF (NEW.credit IS NOT NULL AND NEW.debit IS NOT NULL) THEN
    SIGNAL SQLSTATE '45000'
    SET MESSAGE_TEXT = '\'credit\' and \'debit\' cannot both have a value';
  END IF;
END;
DELIMITER ;

SHOW TRIGGERS;



  /* Affected rows: 0  Found rows: 0  Warnings: 0  Duration for 2 queries: 0.015 sec. */
You have to use delimiter declared earlier to complete the statement:

DELIMITER // -- turn delimiter into "//" instead of ";"
CREATE TRIGGER `ZZZ`.`name` BEFORE INSERT ON `transactions`
FOR EACH ROW 
BEGIN
   -- the code that will be stored for the future use, 
   -- not the statements that will be executed right now
   SELECT something FROM ... ; -- inactive delimiter

END// -- redefined delimiter
DELIMITER ; -- again


Trigger declaration is the statement that contains the code. To tell the code from the statement the different delimiters are used. Redefined // for the containing statement and the default ; for the contained code. 

That's how your queries should look like:

USE `wa3`;

CREATE TABLE `transactions` (
    `id` CHAR(36) NOT NULL,
    `account_number` INT(11) NOT NULL,
    `transactions` INT(11) NOT NULL,
    `debit` DECIMAL(16,2) NULL DEFAULT NULL,
    `credit` DECIMAL(16,2) NULL DEFAULT NULL,
    `balance` DECIMAL(16,2) NOT NULL,
    `created` DATETIME NULL DEFAULT NULL,
    `modified` DATETIME NULL DEFAULT NULL,
    PRIMARY KEY (`id`)
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
;

DELIMITER //

CREATE TRIGGER `wa3`.`InsertCreditOrDebitNotNull` BEFORE INSERT ON `transactions`
FOR EACH ROW BEGIN
  IF (NEW.credit IS NULL AND NEW.debit IS NULL) 
    THEN 
       SIGNAL SQLSTATE '45000'
          SET MESSAGE_TEXT = '\'credit\' and \'debit\' cannot both be null';
  END IF;
END// -- first trigger

CREATE TRIGGER `wa3`.`UpdateCreditOrDebitNotNull` BEFORE UPDATE ON `transactions`
FOR EACH ROW BEGIN
  IF (NEW.credit IS NULL AND NEW.debit IS NULL) 
    THEN
      SIGNAL SQLSTATE '45000'
         SET MESSAGE_TEXT = '\'credit\' and \'debit\' cannot both be null';
  END IF;
END// -- second trigger

CREATE TRIGGER `wa3`.`InsertBothCreditAndDebit` BEFORE INSERT ON `transactions`
FOR EACH ROW BEGIN
  IF (NEW.credit IS NOT NULL AND NEW.debit IS NOT NULL) 
    THEN
      SIGNAL SQLSTATE '45000'
         SET MESSAGE_TEXT = '\'credit\' and \'debit\' cannot both have a value';
  END IF;
END// -- third trigger

CREATE TRIGGER `wa3`.`UpdateBothCreditAndDebit` BEFORE UPDATE ON `transactions`
FOR EACH ROW BEGIN
  IF (NEW.credit IS NOT NULL AND NEW.debit IS NOT NULL) 
    THEN
       SIGNAL SQLSTATE '45000'
          SET MESSAGE_TEXT = '\'credit\' and \'debit\' cannot both have a value';
  END IF;
END// -- fourth trigger

DELIMITER ;

SHOW TRIGGERS;