文章目錄
- 前言
- 一、項目配置
- 二、出現問題
- 三、問題解決
- 四、相關概念
-
- 主鍵、外鍵
- 主鍵自增
-
- 自增值修改機制
- 自增值新增機制
- 為什麼自增主鍵不連續
- 五、方法介紹
- 總結
- 參考文獻
前言
今年研一,參加了學校挑戰杯,項目中需要完成一個登陸及注冊頁的制作,登陸和注冊頁代碼參考了網絡資源,遇到資料庫連接配接完成,卻不能把資料寫入資料庫的問題,研究了一下午最後終于解決。
一、項目配置
登陸注冊頁面在Adobe Dreamweaver上用html+css+js完成,資料庫等環境用wampserver內建環境。
二、出現問題
網頁同資料庫連接配接成功,但使用者注冊、登入頁面的資料不能正常寫入資料庫中。
三、問題解決
一開始以為是代碼出現了問題,查了一下午的相關代碼,發現符合。查閱其他資料時,發現有很多人提到關于資料庫中關于主鍵設定自增的問題,查閱了如何設定主鍵自增後,設定自增,問題解決,自己真是一個大冤種。
四、相關概念
在問題解決之前,先了解一些相關的基本概念。
主鍵、外鍵
關系型資料庫中的一條記錄中有若幹個屬性,若其中某一個屬性組能唯一辨別一條記錄,該屬性組就可以成為一個主鍵。
例:
學生表(學号,姓名,性别,班級)
其中每一名學生的學号是唯一的,學号是一個主鍵。
課程表(課程編号,課程名,學分)
其中課程編号是唯一的,課程編号就是一個主鍵。
成績表(學号,課程号,成績)
成績表中單一一個屬性無法唯一識别一條記錄,學号和課程号的組合才能唯一辨別一條記錄,是以學号和課程号的屬性組是一個主鍵。
成績表中的學号不是成績表的主鍵,但它和學生表中的學号相對應,并且學生表中的學号是學生表的主鍵,則稱成績表中的學号是學生表的外鍵。
定義主鍵和外鍵主要是為了維護關系資料庫的完整性,總結一下:
1.主鍵是能确定一條記錄的唯一辨別,比如,一條記錄包括身份證号,姓名,年齡。身份證号是唯一能确定你這個人的,其他都有可能重複,是以身份證号是主鍵。
2.外鍵用于與另一張表的關聯。是能确定另一張表記錄的字段,用于保持資料的一緻性。比如,A表中的一個字段,是B表的主鍵,那它就可以是A表的外鍵。
主鍵自增
InnoDB引擎的自增值,其實是儲存在記憶體裡,并且到了MySQL8.0版本之後,才有了自增值持久化的能力。也就是實作了如果發生重新開機後,表的自增值可以恢複為MySQL重新開機前的值。
在MySQL5.7及之前的版本,自增值儲存在記憶體裡,并沒有持久化。每次重新開機後,第一次打開表的時候,都會去找自增值的最大值max(id),然後将max(id)+1作為這個表目前的自增值。
在MySQL8.0版本,将自增值的變更記錄在redo log日志中,重新開機的時候依靠redo log日志恢複重新開機之前的值。
自增值修改機制
1.如果插入資料時id字段指定為0、null、或未指定值,那麼就把這個表目前的AUTO_INCREMENT值填到自增字段;
2.如果插入資料時id字段制定了具體的值,就直接使用語句裡指定的值
自增值新增機制
1.如果準備插入的值>=目前自增值,新的自增值就是準備插入的值+1;
2.否則,自增值不變。
為什麼自增主鍵不連續
- 在MySQL 5.7及之前的版本,自增值儲存在記憶體裡,并沒有持久化
- 事務復原(自增值不能復原,因為并發插入資料時,復原自增ID可能會造成主鍵沖突)
- 唯一鍵沖突(由于表的自增值已變,但是因為主鍵發生沖突沒插進去,下一次插入主鍵值=現在變化了的自增值+1,是以不連續)
五、方法介紹
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL1UmMhlTM5Q2Y1UDOjZjNhFWZ1QDO0YDZmlzMlNTMhRzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
在添加字段的時候,設定id為主鍵,并且在上圖方框示意處打勾,即主鍵自增。選擇後,網頁資料可正常寫入資料庫。
總結
以上就是今天要講的内容,本文簡單介紹了主鍵的相關知識,并且講述了如何設定主鍵自增。
參考文獻
1.資料庫主鍵的含義
https://www.cnblogs.com/rainbow-1/p/13907272.html
2.主鍵自增了解
hhttps://blog.csdn.net/ag1412/article/details/122746348