首页  >  问答  >  正文

防止 MySQL 中出现空格、空值和无效日期:我可以采取哪些措施?

用户表

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

触发器

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列

名称列

电子邮件栏

CREATED_IN 和 SIGNED_IN 列

MySQL版本是5.7

在 USERS 表上处理这些要求的最佳方法是什么?

P粉553428780P粉553428780213 天前280

全部回复(1)我来回复

  • P粉845862826

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

    触发器可以如下所示:

    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
    

    注意 - 此触发器允许任何值为 NULL(但只有电子邮件可以为 NULL,所有其他列都定义为 NOT NULL)。

    你可以重新排列这些块,并将概率最大的条件放在第一位。执行 SIGNAL 后触发器不会执行以下代码。

    回复
    0
  • 取消回复