我如何要求 mysql 字段?

How do I require a mysql field?

我刚刚发现 NOT NULL 不要求字段。

创建 mysql table 时,如何创建不能包含 null 或空白(必须包含内容)的字段?

您可以为该字段设置默认值:City varchar(40) DEFAULT 'Sandnes'

我认为你应该做两件事:

  1. 将列设置为 NOT NULL 以强制输入一个值
  2. 使用触发器验证值。

    如果所需的列不满足要求的条件(例如,长度为零),您可以在触发器中取消操作。

This question and its answers 解决第二件事,这里是一个例子:

delimiter $$
CREATE TRIGGER `cancel_insert_if_empty`
BEFORE INSERT ON `your_table`
FOR EACH ROW
BEGIN
    declare msg varchar(255);
    if NEW.your_column is null or length(NEW.your_column) = 0 then
        set msg = "You're doing something wrong! Now suffer the consequences";
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
    end if;
END$$
delimiter ;

在此示例中,如果您尝试在 your_column 中插入 null 值或零长度字符串,则会出现错误并取消插入。引用自 the reference manual:

MySQL handles errors during trigger execution as follows:

  • If a BEFORE trigger fails, the operation on the corresponding row is not performed.
  • A BEFORE trigger is activated by the attempt to insert or modify the row, regardless of whether the attempt subsequently succeeds.
  • An error during either a BEFORE or AFTER trigger results in failure of the entire statement that caused trigger invocation.

当然,你也可以写一个触发器来检查更新。

希望这对您有所帮助。

默认情况下,MySQL 接受无效值。您可以将 MySQL 设置为严格模式以强制使用有效值。这将拒绝不为 NOT NULL 列提供值的查询,并对所有类型的列强制执行完整性。


更新: MySQL 5.7 及更高版本现在默认启用严格模式。所以它不会像以前的版本一样默认接受无效值。


http://dev.mysql.com/doc/refman/5.0/en/sql-mode.html#sql-mode-important

http://dev.mysql.com/doc/refman/5.0/en/sql-mode.html#sqlmode_strict_all_tables

编辑: @Barranka 和@RocketHazmat 在评论中提出了很好的观点。 '' 与 null 不同,因此 MySQL 将允许在 NOT NULL 列中使用。在那种情况下,您将不得不求助于您的代码或触发器。

在代码中(例如PHP),这可能很简单,运行类似于:

if (!strlen($value)) { 
    // Exclude value or use NULL in query
}