簡體   English   中英

MySQL - 字段“id”沒有默認值

[英]MySQL - Field 'id' doesn't have a default value

我無法在我的數據庫中插入任何行,我得到的錯誤是:

這沒有任何意義,因為它之前工作正常,據我所知沒有任何變化。 ID 字段設置為主,不為空和自動遞增: 在此處輸入圖片說明

我能夠通過 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();

我嘗試刪除表並創建一個新表,但沒有解決。 我還能做些什么來嘗試診斷和解決這個問題?

確保這一行:

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

您使用的 bind_param() 的第一個參數是“sssss”,這意味着所有關閉數據都是字符串。 請將其修復為表數據庫上您類型的正確類型數據。 請使用“i”表示整數。 例如:

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

我以上面的代碼為例,因為我看不到你所有的表格描述。

編輯

表定義看起來很奇怪。 看起來id列上有第二個索引。 id列已定義為PRIMARY KEY
正是表定義中的這一行讓我感到困擾......

  KEY `id` (`id`)

奇怪的是,MySQL 甚至允許您在同一列上添加第二個索引,並且不會返回諸如“這樣的索引已經存在”或“列集已經建立索引”之類的錯誤。

我建議您運行一個語句來刪除名為id的索引。 執行任一

  DROP INDEX `id` ON `wp_genomics_results`;

-或者-

  ALTER TABLE `wp_genomics_results` DROP KEY `id`;  

該指數可能導致了該問題。


原答案

我建議你找出到底哪種說法是拋出一個錯誤。

我懷疑這不是INSERT INTO wp_genomics_results語句的執行。

如果是我,我會看看assignZygosityassignReputation函數。 我懷疑罪魁禍首在里面。

我懷疑這些函數中發生了一些事情。 我的猜測(只是猜測)是其中一個函數正在執行查找以獲取外鍵的值。 而且,如果未找到外鍵值,則會執行某些操作以將行插入到引用表中。 函數被調用肯定有某種原因,某種原因我們不只是使用作為參數提供的值......

formatGenotype函數也是一個可疑的對象。 (我不太害怕那個函數名……但同樣,我不知道那個函數在做什么。)

如果這不是問題,如果它真的是代碼中顯示的 INSERT 語句的執行,那么我會在wp_genomics_results表上尋找“BEFORE INSERT”觸發器......也許觸發器正在執行對其他表的插入.


作為一個快速測試,我會注釋掉對這些函數的調用,並只為$zygosity$reputation分配一個文字值。

我想知道拋出錯誤的確切文件中的確切行號。

我還想要來自 MySQL 的完整錯誤消息。

每次執行數據庫交互之后,我想檢查返回,如果有錯誤,我想要(出於調試目的)一個唯一的消息,指示拋出錯誤時我們在代碼中的位置,以及完整的錯誤從 MySQL 返回的消息 ( mysqli_error )。

我不會在沒有證據的情況下假設是執行特定語句導致錯誤。

如果真的是這個語句,那么我們需要看看表的實際 MySQL 定義...... SHOW CREATE TABLE wp_genomics_results語句的輸出。

並且我們希望確保我們正在查看代碼連接到的同一個MySQL 實例和數據庫,而不是其他某個 MySQL 實例或數據庫。

我嘗試使用 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-mode="STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"

對此:

sql-mode=""

現在我可以插入一行,錯誤停止發生。 我仍然不明白為什么會出現這個錯誤。 現在發生了一個新的錯誤:

鍵“P​​RIMARY”的重復條目“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 插入一個新行: 在此處輸入圖片說明

天哪,我覺得自己像個白痴。 一直以來,問題是我選擇了錯誤的數據庫。 所以它從不同的數據庫查詢一個表,並且這個表 ID 字段沒有設置自動增量。 嗯,這是一次很好的學習經歷,更好地了解 MySQL。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM