MYSQL 主鍵的那些 “有意思” 故事
任何資料庫在設計之初都有主鍵,沒有主鍵的表是不完整的,尤其在MYSQL中,而MYSQL中的主鍵設計中,總有一些 “奇葩” 的行為,來讓MYSQL 在執行中,因為主鍵的奇葩設計而導致各種各樣的問題,我們今天來總結總結。
1 主鍵輸入時可以是空的
下面的表,中的確id 是主鍵,並且是自增的,但是插入的時候,的確可以在插入的位置寫入 NULL ,但這裡會實際上在上面插入對應的自增的資料。
insert into test_p (id,date) values (null,'2022-01-29');
insert into test_p (id,date) values (null,'2022-01-29');
insert into test_p (id,date) values (1,'2022-01-29');
實際上這裡的有一個問題,就是為什麼主鍵可以插入NULL,這裡利用了一個在主鍵設計中的沒有寫 NOT NULL 的漏洞,導致寫入的資料可以是NULL 因為NULL 不代表任何,是或否,代表不知道。
所以在編寫程式的時候,不要在對自增的主鍵欄位使用null 作為插入的值使用。
2 主鍵看上去可以是空的
在欄位是varchar型別的情況下,輸入的值不能為NULL,但可以為‘’,而由於 VARCHAR型別的特性,一個表中如果輸入'' 也只能有一個,在輸入各種空格,則會提示重複主鍵。
綜上所述,複合主鍵使用 on duplicate key update 應該小心注意邏輯上是否符合最初的設計要求,同時在MYSQL 的表設計中應儘量不使用複合主鍵來進行資料表的設計,避免一些未知問題的產生。
這裡也留下一個問題,如果我不使用複合主鍵,而使用複合唯一索引,又會是什麼故事。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024420/viewspace-2934378/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 中的自增主鍵MySql
- MySQL新增自增主鍵的坑MySql
- MySQL 主鍵自增也有坑?MySql
- MySQL 缺少主鍵的表的效能下降的原因MySql
- 深入瞭解MySQL中的自增主鍵MySql
- Mysql關於自增主鍵,自增主鍵優化總結MySql優化
- MySQL 主鍵自增 Auto Increment用法MySqlREM
- mysql-刪除和新增主鍵MySql
- 向Mysql主鍵自增長表中新增資料並返回主鍵MySql
- 那些IP授權遊戲們的故事遊戲
- 區塊鏈認知過程,幾個有意思的小故事區塊鏈
- MySQL8自增主鍵變化MySql
- mysql建表必須使用主鍵嗎MySql
- MySQL自增主鍵跳號問題MySql
- MySQL 8 新特性之自增主鍵的持久化MySql持久化
- [MySQL]為什麼主鍵最好是有序遞增的MySql
- 磁碟、mysql、redis、hana 的故事!MySqlRedis
- MYSQL中的那些鎖MySql
- MySQL 聚簇索引一定是主鍵嗎MySql索引
- MySQL 預設排序真的是按主鍵來排序的嗎MySql排序
- MySQL 資料庫自增主鍵生成的優缺點MySql資料庫
- github 主頁可以 DIY 了,很有意思Github
- mysql刪除主鍵索引,刪除索引語法MySql索引
- MySQL不建議用UUID做innodb主鍵的幾條原因MySqlUI
- mysql預先取自動增長主鍵的下一個值MySql
- 速通的故事:與幀數賽跑的那些人
- java面試一日一題:mysql中的自增主鍵Java面試MySql
- MySQL裡的那些日誌們MySql
- MySql索引那些事MySql索引
- 【mysql】mysql的資料庫主從(一主一從)MySql資料庫
- 主鍵命名
- 新的主鍵和外來鍵的語法
- 主鍵和外來鍵
- MYSQL資料庫與Emoji表情的故事MySql資料庫
- mysql innodb 主鍵INT、BIGINT、VARCHAR併發插入效能對比MySql
- 說說Mongodb 與 MySQL的那些事MongoDBMySql
- MySQL 分割槽表,為什麼分割槽鍵必須是主鍵的一部分?MySql
- MyBatis的Insert操作自增主鍵的實現,Mysql協議與JDBC實現MyBatisMySql協議JDBC