search

Home  >  Q&A  >  body text

Prevent spaces, null values, and invalid dates in MySQL: What can I do?

user table

CREATE TABLE `USERS` (
 `ID` char(255) COLLATE utf8_unicode_ci NOT NULL,
 `NAME` char(255) COLLATE utf8_unicode_ci NOT NULL,
 `EMAIL` char(255) COLLATE utf8_unicode_ci DEFAULT NULL,
 `CREATED_IN` datetime NOT NULL,
 `SIGNED_IN` datetime NOT NULL,
 PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

trigger

CREATE TRIGGER `ABC` BEFORE INSERT ON `USERS` FOR EACH ROW
IF NEW.ID = "" OR NEW.NAME = "" OR
NEW.CREATED_IN = "" OR NEW.CREATED_IN = "0000-00-00 00:00:00" OR
NEW.SIGNED_IN = "" OR NEW.SIGNED_IN = "0000-00-00 00:00:00"
THEN SIGNAL SQLSTATE "45000"; END IF

ID column

Name column

Email Column

CREATED_IN and SIGNED_IN columns

MySQL version is 5.7

What is the best way to handle these requirements on the USERS table?

P粉553428780P粉553428780255 days ago322

reply all(1)I'll reply

  • P粉845862826

    P粉8458628262024-03-20 00:49:38

    A trigger can look like this:

    CREATE TRIGGER process_input
    BEFORE INSERT ON USERS
    FOR EACH ROW
    BEGIN
        SET NEW.id = REPLACE(NEW.id, ' ', '');
        IF NEW.id = '' THEN
            SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '`id` cannot be empty.';
        END IF;
    
        SET NEW.name = TRIM(NEW.name);
        IF NEW.name = '' THEN
            SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = ''name` cannot be empty.';
        END IF;
    
        SET NEW.email = REPLACE(NEW.email, ' ', '');
        IF NEW.email = '' THEN
            SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '`email` cannot be empty.';
        END IF;
    
        IF STR_TO_DATE(created_in, '%Y-%m-%d %H:%i:%s') IS NULL THEN
            SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Incorrect `created_in` datetime value.';
        END IF;
    
        IF STR_TO_DATE(signed_in, '%Y-%m-%d %H:%i:%s') IS NULL THEN
            SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Incorrect `signed_in` datetime value.';
        END IF;
    END
    

    NOTE - This trigger allows any value to be NULL (but only email can be NULL, all other columns are defined as NOT NULL).

    You can rearrange the blocks and put the condition with the highest probability first. The trigger will not execute the following code after executing SIGNAL.

    reply
    0
  • Cancelreply