【问题标题】:How do I require a mysql field?我如何需要一个 mysql 字段?
【发布时间】:2015-03-11 16:32:22
【问题描述】:

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

在创建mysql表时,如何创建不能包含null或空白的字段(必须有东西)?

【问题讨论】:

  • NOT NULL 确实 使字段“必需”,因为它需要存储一个值。 NULL 表示“没有价值”。根据 MySQL,一个空白字符串仍然是一个“值”。我建议让您的客户在插入数据之前检查它是否为空白。
  • 这个问题可能会有所帮助:stackoverflow.com/q/24424363
  • @RocketHazmat true ... 只是在点击链接时看到...所以使用 PRE-INSERT 和 PRE-UPDATE 触发器...虽然不必喜欢那些
  • @XiVix:请记住,MySQL 将空白字符串视为“值”。

标签: mysql field


【解决方案1】:

默认情况下,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 在 cmets 中取得了不错的成绩。 '' 与 null 不同,因此 MySQL 将允许它出现在 NOT NULL 列中。在这种情况下,您将不得不求助于您的代码或触发器。

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

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

【讨论】:

  • 我可以仅针对特定表或查询执行此操作,还是全局执行此操作?
  • 我不确定每张桌子的情况。我知道你可以在配置文件中设置它,你可以在每个会话中设置它SET sql_mode = ...;
  • 我喜欢在我的所有数据库中保持严格模式,然后在编程时牢记这一点。这可以确保您的程序也不会插入任何无效值。你在建表的时候给列设置了参数,为什么不遵守呢?
【解决方案2】:

我认为你应该做两件事:

  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 在触发器执行期间处理错误如下:

  • 如果BEFORE 触发器失败,则不执行对相应行的操作。
  • BEFORE 触发器在尝试插入或修改行时被激活,无论该尝试随后是否成功。
  • BEFOREAFTER 触发器期间的错误会导致导致触发器调用的整个语句失败。

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

希望这会有所帮助。

【讨论】:

  • 非常感谢,但我试图避免使用触发器,所以我选择了德文郡和严格的方法。
【解决方案3】:

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

【讨论】:

  • 如果用户专门插入一个零长度字符串,这将不起作用。示例:insert into a_table(a_column) values('');
  • @Barranka,真的。但从技术上讲,这不是空的。所以 MySQL 不会知道区别,然后是的,你需要像你的答案一样的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-14
  • 2014-07-24
  • 1970-01-01
  • 2011-07-21
  • 2017-09-11
  • 2022-09-22
  • 2012-03-12
相关资源
最近更新 更多