假设我已经在MySQL中创建了一个表,如下所示
CREATE TABLE IF NOT EXISTS `sales` (
`id` smallint(5) unsigned NOT NULL auto_increment,
`client_id` smallint(5) unsigned NOT NULL,
`order_time` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
`sub_total` decimal(8,2) NOT NULL,
`shipping_cost` decimal(8,2) NOT NULL,
`total_cost` decimal(8,2) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;
--
-- Dumping data for table `sales`
--如果我为当前表添加了一个新字段must_fill。
`must_fill` tinyint(1) unsigned NOT NULL,默认情况下,用户可以向表中插入少于fiels项的数目,就像下面的脚本一样。
INSERT INTO `sales` (`id`, `client_id`, `order_time`, `sub_total`, `shipping_cost`, `total_cost`) VALUES
(8, 12312, '2007-12-19 01:30:45', 10.75, 3.00, 13.75);这很好。
但是,当用户计划插入新数据时,如何将字段(must_fill)配置为必须包含的数据字段。
顺便说一句,代码将集成到PHP脚本中。
或者,我只能编写特殊的PHP脚本来判断must_fill是否为null,当用户试图运行插入到绑定了某些数据值的脚本时,是否为空?
发布于 2010-05-05 03:20:00
很难执行这一点,因为MySQL从来都不是这样设计的。NOT NULL表中的MySQL名称仅仅意味着该值永远不可能是NULL,而不是必须提供一个值:如果省略该值,MySQL将找到一个默认值。但是,如果省略了一个真正的值,则可以提供一个很烦人的默认值;确切地说,要使用什么取决于应用程序。
我也会看看MySQL服务器模式。您可能希望启用STRICT_ALL_TABLES,但这是一个相当苛刻的设置,如果您的应用程序是针对MySQL的宽松默认机制编程的,那么它可能会中断。
发布于 2010-05-05 03:30:44
甚至连check constraint都不能阻止MySQL插入整数的默认隐式:
create table YourTable (
id int primary key
, must_fill tinyint not null
, constraint must_fill_constraint check (must_fill <> 0)
);
insert into YourTable (id) values (1);
select must_fill from YourTable t1;这将打印0,尽管存在禁止0的约束。您可以更改此行为--我的启用严格模式。
发布于 2010-05-05 03:35:02
如果不指定“严格模式”,MySQL将默认一个整数列(如must_fill )为零。尝试添加一个
设置会话sql_mode=STRICT_ALL_TABLES
在插入之前,您的示例插入现在应该会产生一个错误,因为没有为must_fill列提供任何值。
在启动MySQL守护进程时,可以将严格模式设置为命令行选项。详细信息在下面我提到的MySQL模式文档页面中。
MySQL模式http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html
https://stackoverflow.com/questions/2770314
复制相似问题