Maison  >  Questions et réponses  >  le corps du texte

Empêcher les espaces, les valeurs nulles et les dates invalides dans MySQL : que puis-je faire ?

Tableau utilisateur

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

Déclencheur

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

Colonne ID

Colonne Nom

Barre de courrier électronique

Colonnes CREATED_IN et SIGNED_IN

La version MySQL est 5.7

Quelle est la meilleure façon de gérer ces exigences sur le formulaire UTILISATEURS ?

P粉553428780P粉553428780213 Il y a quelques jours286

répondre à tous(1)je répondrai

  • P粉845862826

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

    Un déclencheur peut ressembler à ceci :

    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
    

    REMARQUE - Ce déclencheur permet à n'importe quelle valeur d'être NULL (mais seul l'e-mail peut être NULL, toutes les autres colonnes sont définies comme NON NULL).

    Vous pouvez réorganiser les blocs et mettre en premier la condition avec la probabilité la plus élevée. Le déclencheur n'exécutera pas le code suivant après l'exécution de SIGNAL.

    répondre
    0
  • Annulerrépondre