我如何需要mysql字段?

时间:2015-01-13 16:30:43

标签: mysql field

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

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

3 个答案:

答案 0 :(得分:4)

默认情况下,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
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我认为你应该做两件事:

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

    如果所需的列不满足所需条件(例如,具有零长度),则可以在触发器内取消操作。

  3. 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 ;
    

    在此示例中,如果您尝试在null中插入your_column值或零长度字符串,则错误将上升并且插入将被取消。引自the reference manual

      

    MySQL在触发器执行期间处理错误,如下所示:

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

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

    希望这有帮助。