我刚刚发现NOT NULL不需要字段。
创建mysql表时,如何创建一个不能包含null或空白的字段(必须包含某些内容)?
答案 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)
我认为你应该做两件事:
NOT NULL
以强制输入值如果所需的列不满足所需条件(例如,具有零长度),则可以在触发器内取消操作。
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
触发器,无论该尝试是否随后成功。BEFORE
或AFTER
触发器中的错误导致导致触发器调用的整个语句失败。
当然,您也可以编写触发器来检查更新。
希望这有帮助。