Innodb自增主鍵與sql_mode

1.自增主鍵mysql

1.設置自增主鍵sql

建表設置自增主鍵,設置自增主鍵須要惟一約束,不然會報錯.(即指定列數據惟一)

mysql> create table test_zz(id int auto_increment,name varchar(11),primary key(id));數據庫

mysql> create table test_aa(id int auto_increment,name varchar(11),primary key(id))auto_increment=10;服務器

alter設置自增主鍵:

alter table test_mmm modify id integer auto_increment;函數

alter table test_jj modify id int auto_increment;性能

2.自增加參數測試

 mysql> show variables like '%auto_increment%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 1     |
| auto_increment_offset    | 1     |
+--------------------------+-------+
2 rows in set (0.01 sec)

auto_increment_offset 起始值,範圍1-65535spa

auto_increment_increment步長,範圍1-65535事務

說明:內存

1.在同步配置時,須要將兩臺服務器的auto_increment_increment增加量都配置爲2而要把auto_increment_offset分別配置爲12.這樣才能夠避免兩臺服務器同時作更新時自增加字段的值之間發生衝突。

2.使用自增加:insert時該字段寫爲null便可.

 

3.MySQL中MyISAM和innodb自增的區別
MyISAM中,自增值會進行持久化,在數據自增完成後,持久化到磁盤中,而innodb不會進行對應的持久化。自增鎖是INNODB比較特殊的鎖,由於大多數鎖都是在事務完成後自動解除鎖定,可是若是自增鎖也這樣作的話,會大大影響數據庫自增的插入性能。所以innodb存儲引擎的自增鎖是在插入SQL語句完成後當即釋放。自增鎖之間是不兼容的,就是一個SQL在進行自增插入的時候,另外一條SQL須要等待。每一個表的自增加值不會進行持久化,而是每次INNODB 重啓後去表中查詢最大的自增主鍵值後,將獲得的值保存在內存中。
說明:
1.數據庫正常運行,刪除自增主鍵最大的一列後再次插入,則自增主鍵值是在以前最大的值上加步長,而非是刪除的主鍵值。

2.Innodb不持久化自增結果如到了17後刪除15,1617,重啓數據庫後其值爲15.

3.MyiSAM 持久化自增結果,如到了17後刪除15,1617,重啓數據庫後其值爲18.

 

2.sql_mode

1.查看sql_mode

 sql_mode是個很容易被忽視的變量,默認值是空值(5.6),在這種設置下是能夠容許一些非法操做的,好比容許一些非法數據的插入。在生產環境必須將這個值設置爲嚴格模式,因此開發、測試環境的數據庫也必需要設置,這樣在開發測試階段就能夠發現問題.

查看當前數據庫的sql_mode:(mysql5.7)

mysql> show variables like '%sql_mode%';

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

5.6sql_mode5.7sql_mode不同,故升級可能致使有些sql不能用.

2.各類sql_mode的含義

ONLY_FULL_GROUP_BY對於GROUP BY聚合操做,若是在SELECT中的列,沒有在GROUP BY中出現,那麼這個SQL是不合法的,由於列不在GROUP BY從句中

NO_AUTO_VALUE_ON_ZERO:該值影響自增加列的插入。默認設置下,插入0NULL表明生成下一個自增加值。若是用戶 但願插入的值爲0,而該列又是自增加的,那麼這個選項就有用了。

STRICT_TRANS_TABLES:在該模式下,若是一個值不能插入到一個事務表中,則中斷當前的操做,對非事務表不作限制

NO_ZERO_IN_DATE:在嚴格模式下,不容許日期和月份爲零

NO_ZERO_DATE:設置該值,mysql數據庫不容許插入零日期,插入零日期會拋出錯誤而不是警告。

ERROR_FOR_DIVISION_BY_ZERO:在INSERTUPDATE過程當中,若是數據被零除,則產生錯誤而非警告。如 果未給出該模式,那麼數據被零除時MySQL返回NULL

NO_AUTO_CREATE_USER:禁止GRANT建立密碼爲空的用戶

NO_ENGINE_SUBSTITUTION:若是須要的存儲引擎被禁用或未編譯,那麼拋出錯誤。不設置此值時,用默認的存儲引擎替代,並拋出一個異常.

PIPES_AS_CONCAT:將"||"視爲字符串的鏈接操做符而非或運算符,這和Oracle數據庫是同樣的,也和字符串的拼接函數Concat相相似.

ANSI_QUOTES:啓用ANSI_QUOTES後,不能用雙引號來引用字符串,由於它被解釋爲識別符

相關文章
相關標籤/搜索