2010-05-05 41 views
0

假设我已经创建了一个表中的MySQL如下的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为空或不是当用户试图运行插入脚本进入绑定一些数据值?

回答

2

由于MySQL从来没有这样设计过,所以很难执行此操作。在MySQL表中指定仅仅意味着该值永远不会是NULL,而不是必须提供的值:如果省略,MySQL将找到默认值。但是,如果省略实际值,则可以提供一个令人讨厌的默认值;究竟使用什么取决于您的应用程序。

我也看看MySQL Server Modes。你可能想要启用STRICT_ALL_TABLES,但这是一个相当严格的设置,如果你的应用程序已经针对MySQL的宽松默认设置进行了编程,那么你的应用程序可能会中断。

+1

+1是的,严格的模式是实现这一点的唯一途径。 – 2010-05-05 03:22:49

0

甚至没有一个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。您可以更改此行为,我启用strict mode

+0

MySQL不支持检查约束。它解析它们,但不存储约束。它默默地忽略了它们。这是我对MySQL最大的抱怨之一。 – 2010-05-05 03:32:55

+0

@Bill Karwin:谢谢,你说得对。不能相信我忘了:) – Andomar 2010-05-05 10:11:13

0

如果你没有指定“严格模式”,MySQL会默认一个整数列,就像你的must_fill为零一样。尝试INSERT之前加入

SET SESSION的sql_mode = STRICT_ALL_TABLES

,并因为没有值的must_fill列提供您的例子INSERT现在应该产生一个错误。

当您启动MySQL守护进程时,您可以将严格模式设置为命令行选项。详细信息在下面我提到的MySQL模式文档页面中。

MySQL的模式 http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html