我如何要求 mysql 字段?
How do I require a mysql field?
我刚刚发现 NOT NULL 不要求字段。
创建 mysql table 时,如何创建不能包含 null 或空白(必须包含内容)的字段?
您可以为该字段设置默认值:City varchar(40) DEFAULT 'Sandnes'
我认为你应该做两件事:
- 将列设置为
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 ;
在此示例中,如果您尝试在 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
}
我刚刚发现 NOT NULL 不要求字段。
创建 mysql table 时,如何创建不能包含 null 或空白(必须包含内容)的字段?
您可以为该字段设置默认值:City varchar(40) DEFAULT 'Sandnes'
我认为你应该做两件事:
- 将列设置为
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 ;
在此示例中,如果您尝试在 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
orAFTER
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
}