主鍵自增,Insert為0的記錄導致資料混亂
牙疼不是病,疼起來真要命.
環境.MySQL 5.6.14
SQL_Mode:STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
生產環境 配置表,設定主鍵為自增.
一天某同學讓我幫忙從測試導一批資料到生產.
雖然我對這種方式深惡痛絕,但是沒有辦法..也只能照做.
匯入之後的第二天,業務發現很多生產資料錯亂了。
這個禮物的配置表,主鍵原本設計成自增主鍵.
但是後來他們用0表示一種特殊禮物...坑就在這裡了。
過程模擬
當時的SQL_Mode是:STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
如果這時執行如下的語句,
insert into config_gift select 0,'蛋糕';
insert into config_gift select null,'香水';
檢視結果竟然如下:
MySQL 如果已經設定了主鍵自動增長,但是後來卻 插入 0 或者 null 作為主鍵值的話, MySQL會用自增長的值,取代原本的 0 或者 null 。
業務程式碼中寫死了 0 這個禮物ID的判斷,所以導致了大量資料錯亂,花了很長時間修正.
這種事情猝不及防
業務方定的這個特殊禮物就用0表示,而且也沒有人來通知資料庫...
資料上線的時候,都是一批資料,人力甄別資料似乎也不現實.
改SQL_mode保平安吧.
在自增主鍵下,處理主鍵為0的資料
set @@session.sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,no_auto_value_on_zero'
修改Global和Session級別的SQL_mode之後,主鍵為0的禮物可以正確插入了。
主要注意的是,即使在這個SQL_mode下(STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,no_auto_value_on_zero)
自增主鍵,Insert主鍵為null的資料,還是會使用自增主鍵的值作為主鍵,而不是報錯.
環境.MySQL 5.6.14
SQL_Mode:STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
生產環境 配置表,設定主鍵為自增.
一天某同學讓我幫忙從測試導一批資料到生產.
雖然我對這種方式深惡痛絕,但是沒有辦法..也只能照做.
匯入之後的第二天,業務發現很多生產資料錯亂了。
這個禮物的配置表,主鍵原本設計成自增主鍵.
但是後來他們用0表示一種特殊禮物...坑就在這裡了。
過程模擬
-
drop table if exists config_gift;
-
create table config_gift(
-
GiftID int not null primary key auto_increment,
-
GiftName varchar(32) not null
-
) auto_increment=50000;
-
-
insert into config_gift(GiftName) select '鮮花';
-
insert into config_gift(GiftName) select '鞭炮';
-
insert into config_gift(GiftName) select '福袋';
-
-
- select * from config_gift;
如果這時執行如下的語句,
insert into config_gift select 0,'蛋糕';
insert into config_gift select null,'香水';
檢視結果竟然如下:
MySQL 如果已經設定了主鍵自動增長,但是後來卻 插入 0 或者 null 作為主鍵值的話, MySQL會用自增長的值,取代原本的 0 或者 null 。
業務程式碼中寫死了 0 這個禮物ID的判斷,所以導致了大量資料錯亂,花了很長時間修正.
這種事情猝不及防
業務方定的這個特殊禮物就用0表示,而且也沒有人來通知資料庫...
資料上線的時候,都是一批資料,人力甄別資料似乎也不現實.
改SQL_mode保平安吧.
在自增主鍵下,處理主鍵為0的資料
set @@session.sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,no_auto_value_on_zero'
修改Global和Session級別的SQL_mode之後,主鍵為0的禮物可以正確插入了。
主要注意的是,即使在這個SQL_mode下(STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,no_auto_value_on_zero)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-2133054/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Mybatis:插入資料返回自增主鍵MyBatis
- 使用Spring JDBC新增記錄如何返回自增主鍵值SpringJDBC
- 向Mysql主鍵自增長表中新增資料並返回主鍵MySql
- mybatis入門程式:向資料庫中新增使用者&&自增主鍵和非自增主鍵的返回MyBatis資料庫
- 資料庫自增主鍵可能產生的問題資料庫
- MySQL 資料庫自增主鍵生成的優缺點MySql資料庫
- postgresql自增主鍵SQL
- Mysql關於自增主鍵,自增主鍵優化總結MySql優化
- MySQL 中的自增主鍵MySql
- DELETE資料導致INSERT邏輯讀增加delete
- Production DB expdp 導致standby歸檔恢復時混亂
- 自增長主鍵回顯實現,批次資料插入
- MyBatis的Insert操作自增主鍵的實現,Mysql協議與JDBC實現MyBatisMySql協議JDBC
- MySQL新增自增主鍵的坑MySql
- sysbench花式採坑之二:自增值導致的主鍵衝突
- 資料表設計之主鍵自增、UUID或聯合主鍵UI
- mysql主鍵的缺少導致備庫hangMySql
- MySQL 主鍵自增也有坑?MySql
- Oracle 建立主鍵自增表Oracle
- 獲取不同資料庫新增記錄主鍵值資料庫
- PostgreSQL 建立主鍵自增表的 DDLSQL
- 關於資料庫表記錄主鍵生成的問題?資料庫
- Mybatis-Plus3.0預設主鍵策略導致自動生成19位長度主鍵id的坑MyBatisS3
- 【Mysql】mysql主鍵的缺少導致備庫hangMySql
- MySQL 主鍵自增 Auto Increment用法MySqlREM
- postgresql重置序列和自增主鍵SQL
- PostgreSQL-亂序插入資料導致索引膨脹SQL索引
- 深入瞭解MySQL中的自增主鍵MySql
- PostgreSQL建立自增主鍵的兩種方法SQL
- 資料混亂如何正確使用CRM
- 一條主鍵索引SQL導致的CPU被打滿索引SQL
- oracle 序列值導致的主鍵衝突問題Oracle
- Laravel 中使用 Redis 生成自增主鍵LaravelRedis
- MySQL8自增主鍵變化MySql
- SqlServer主鍵和自增長設定SQLServer
- MySQL自增主鍵跳號問題MySql
- 主鍵、自增主鍵、主鍵索引、唯一索引概念區別與效能區別索引
- 物料主記錄的資料結構資料結構