MySQL - Field' id'没有默认值

时间:2016-10-08 02:43:47

标签: php mysql

我无法在数据库中插入任何行,而我得到的错误是:

这没有任何意义,因为之前工作正常,据我所知,没有任何改变。 ID字段设置为primary,而不是null和自动增量: enter image description here

我能够通过PHPMyAdmin手动插入一行。下面是插入的代码:

    $query = "INSERT INTO wp_genomics_results (file_id,snp_id,genotype,reputation,zygosity) VALUES (?,?,?,?,?)";

    $stmt = $ngdb->prepare($query);

    $file_id = $this->fileID;
    $snp_id = $row['id'];
    $genotype = $this->formatGenotype($extractedGenotype);
    $zygosity = $this->assignZygosity($genotype,$minor_allele);
    $reputation = $this->assignReputation($zygosity,$genotypes);

    $stmt->bind_param("sssss", $file_id,$snp_id,$genotype,$reputation,$zygosity);
    $stmt->execute();

我尝试删除该表并创建一个新表,但它没有修复它。还有什么我可以做的来尝试和诊断并解决这个问题吗?

4 个答案:

答案 0 :(得分:0)

确保这一行:

  

$ stmt-> bind_param( “SSSSS”,   $的file_id,$ snp_id,$基因型,$信誉,$接合性);

您使用的bind_param()的第一个参数是“sssss”,表示所有关闭数据都是字符串。请将其修复为表数据库中类型的正确类型数据。 请使用“i”表示整数。例如:

  

$ stmt-> bind_param( “iisss”,   $的file_id,$ snp_id,$基因型,$信誉,$接合性);

我将上面的代码作为一个例子,因为我无法看到你所有的表格。

答案 1 :(得分:0)

修改

表定义看起来很奇怪。看起来id列上有第二个索引。 id列已定义为PRIMARY KEY 表格定义中的这一行困扰着我......

  KEY `id` (`id`)

奇怪的是,MySQL甚至会让你在同一列上添加第二个索引,并且不会返回错误,例如“这样的索引已经存在”或“列集已经被索引”或者这样的。

我建议你运行一个语句来删除名为id的索引。执行

  DROP INDEX `id` ON `wp_genomics_results`;

-OR -

  ALTER TABLE `wp_genomics_results` DROP KEY `id`;  

这个指数可能是导致这个问题的原因。

原始回答

我建议您弄明白正好哪个语句会引发错误。

我怀疑执行INSERT INTO wp_genomics_results语句。

如果是我,我会看一下assignZygosityassignReputation函数。我怀疑罪魁祸首在那里。

我怀疑这些功能正在发生。我的猜测(只是猜测)是其中一个函数正在执行查找以获取外键的值。并且,如果未找到外键值,则执行某些操作以将行插入到引用的表中。必须有某些原因才能调用函数,我们不仅仅使用提供的值作为参数......

formatGenotype功能也是一个嫌疑人,靠近。 (我不太担心那个函数名......但是,我再也不知道那个函数在做什么了。)

如果那不是问题,如果它确实是代码中显示的INSERT语句的执行,那么我会在wp_genomics_results表上查找“BEFORE INSERT”触发器...也许触发器是执行插入到其他表。

作为快速测试,我会注释掉对这些功能的调用,只需为$zygosity$reputation分配一个字面值。

我想知道正在抛出错误的 exact 文件中的完全行号。

我还想从MySQL获得完整的错误消息。

每次执行数据库交互之后,我想检查返回,如果有错误,我想要(出于调试目的)一条唯一的消息,指示我们在代码中的位置抛出错误,以及从MySQL(mysqli_error)返回的完整错误消息。

在没有证据的情况下,我不会假设执行特定语句导致错误。

如果真的是这个陈述,那么我们需要看一下表的实际MySQL定义......来自SHOW CREATE TABLE wp_genomics_results语句的输出。

我们希望确保我们正在查看代码所连接的相同的 MySQL实例和数据库,而不是其他一些MySQL实例或数据库。

答案 2 :(得分:0)

我尝试使用WordPress数据库连接插入:

$wpdb->query("INSERT INTO wp_genomics_results (file_id,snp_id,genotype,reputation,zygosity) VALUES ('$file_id','$snp_id','$genotype','$reputation','$zygosity')");

并且它可以工作,但如果我尝试使用与我自己的数据库连接相同的查询:

$db = new mysqli('localhost', NG_DB_USER, NG_DB_PASS, NG_DB_NAME);
$db->query("INSERT INTO wp_genomics_results (file_id,snp_id,genotype,reputation,zygosity) VALUES ('111','$snp_id','$genotype','$reputation','$zygosity')");

我得到同样的错误:

  

错误号码:1364 - MySQL错误字段'id'没有默认值

我不明白为什么它适用于wordpress但不适用于我自己的数据库连接。我进入了我的mysql.ini文件并更改了它:

  

SQL模式=“STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,   NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER“

到此:

  

SQL模式= “”

现在我可以插入一行,错误停止发生。我仍然不明白为什么这个错误一开始就出现了。现在发生了一个新的错误:

  

键'PRIMARY'重复输入'0'

我不明白,因为id列设置为自动增量。那里也没有ID = 0的行。我甚至清空了表,以确保在ID = 0时没有行。我对发生的事情感到非常困惑。下面是表结构的输出:

> mysql> SHOW CREATE TABLE wp_genomics_results;

| wp_genomics_results | CREATE TABLE `wp_genomics_results` (
   `id` bigint(11) NOT NULL AUTO_INCREMENT,
   `file_id` int(11) NOT NULL,
   `snp_id` int(11) NOT NULL,
   `genotype` varchar(3) NOT NULL,
   `reputation` varchar(3) NOT NULL,
   `zygosity` int(3) NOT NULL,
    PRIMARY KEY (`id`),
    KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+---------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

我注意到它在集合中表示1行,但该表实际上是空的。再一次,我可以通过PHPMyAdmin插入一个新行: enter image description here

答案 3 :(得分:0)

天哪,我觉得自己像个白痴。一直以来,问题在于我选择了错误的数据库。所以它是从不同的数据库查询表,并且这个表ID字段没有设置自动增量。好吧,这是一个很好的学习经验,更好地了解MySQL。