MySQL Insert需要指定所有字段吗?

时间:2012-08-08 13:55:02

标签: mysql

当我执行指定表中某些但不是所有字段的pdo时,它在一台服务器上插入正常,但无法在另一台服务器上插入。

例如,关于问题服务器......

表格包含三个字段idtimeintervention ...

如果我运行此语句,它会按预期插入。

$query = "INSERT INTO data_agreements (`id`, `time`, `intervention`) VALUES (?, ?, ?)";
$q = $pdo->prepare($query);
$q->execute(array("x", "y", "z"));

但如果我运行以下语句,则无法插入。

$query = "INSERT INTO data_agreements (`id`, `time`) VALUES (?, ?)";
$q = $pdo->prepare($query);
$q->execute(array("x", "y"));

问题服务器是带有MySql 5,PHP 5.2.6的IIS。在具有MySql 5,PHP 5.2.6的不同服务器Apache上,两个语句都按预期插入。所以我想知道是否需要在问题服务器上设置一些MySQL安装/设置,告诉它接受只指定表中字段子集的语句。 ?

谢谢!

3 个答案:

答案 0 :(得分:0)

INSERT INTO data_agreements 
  (id, time) 
VALUES 
  (?, ?) ;

运行正常,如果其他字段{在这种情况下为intervention已使用DEFAULT属性定义,或者在表格为AUTO_INCREMENT时定义创建。如果没有,则必须明确地为INSERT语句提供值。

在2个安装中检查SHOW CREATE TABLE data_agreements,如何定义表。

表的TIMESTAMP列具有非显而易见的功能。其中只有一个可以具有DEFAULT CURRENT_TIMESTAMP属性(如果您没有声明,则表中只有第一个属性具有此默认值)。

如果您定义了一个包含多个时间戳列的表,然后删除了第一个,则可能导致您遇到此问题。

答案 1 :(得分:0)

您的SQL语句没有语法错误。 MySQL服务器中没有特定的“设置”来控制此行为,但是有一些设置可以影响特定的INSERT语句是否成功,例如,允许无效日期的设置(即不存在的日期)例如6月31日),以及允许存储零日期('0000-00-00')的设置。 (这种行为在不同版本中发生了变化,其中“旧”(例如V3.23)默认为允许无效日期,而“较新”(例如v5.1)默认为禁止无效日期。)

如果为绑定参数提供的值有效,那么您观察到的行为最可能的解释是存在(或将会)违反的CONSTRAINT。

这可能是主键约束,唯一键约束,外键约束,NOT NULL约束,或者它甚至可能是抛出异常的触发器。

例如,列干预可以定义为NOT NULL,并且没有指定默认值。

MySQL错误信息可能对调试它有用。

另一种可能性是这个语句实际上是成功的,但是在一个事务的上下文中执行,该事务随后被回滚而不是被提交。)

你的问题中没有足够的信息可以告诉你。

我建议您比较两个数据库上的表定义。最简单的方法(对我来说)是从每个数据库中获取SHOW CREATE TABLE intervention语句的输出,并寻找差异。其中一个数据库也可能有一个BEFORE INSERT FOR EACH ROW触发器,而另一个则缺少另一个。

答案 2 :(得分:0)

我打赌列intervention 不允许 null值。

尝试更改表并查看它是否有效:

ALTER table data_agreements Modify intervention varchar(50) null DEFAULT '';

并尝试再次执行查询。我假设intervention是字符串,但是,当然,您可以修改它以满足您的需求。

感谢。