最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL的主鍵命名策略相關(guān)

 更新時間:2021年01月28日 12:01:49   作者:jeanron100  
這篇文章主要介紹了MySQL的主鍵命名策略的的相關(guān)資料,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下

最近在梳理數(shù)據(jù)生命周期管理的細節(jié)時,發(fā)現(xiàn)了一個小問題,那就是MySQL的主鍵命名策略,似乎會忽略任何形式的自定義命名。

也就意味著你給主鍵命名為idx_pk_id這種形式,在MySQL里面會統(tǒng)一按照PRIMARY來處理。

當(dāng)然我們可以在這個基礎(chǔ)之上做一些拓展和補充。

首先來復(fù)現(xiàn)下問題,我們連接到數(shù)據(jù)庫test,然后創(chuàng)建表test_data2.

mysql> use test

mysql> create table test_data2 (id int ,name varchar(30));

Query OK, 0 rows affected (0.05 sec)

接著創(chuàng)建一個主鍵,命名為idx_pk_id,從執(zhí)行情況來看,MySQL是正常處理了。

mysql> alter table test_data2 add primary key idx_pk_id(id);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0

為了進一步對比,我們添加一個唯一性索引(輔助索引),來看看它們的差異。

mysql> alter table test_data2 add unique key idx_uniq_name(name);
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0

查看主鍵命名方法1:使用show indexes命令

要查看MySQL索引的信息,使用show indexes from test_data2就可以。

mysql> show indexes from test_data2\G
*************************** 1. row ***************************
    Table: test_data2
  Non_unique: 0
   Key_name: PRIMARY
 Seq_in_index: 1
 Column_name: id
  Collation: A
 Cardinality: 0
   Sub_part: NULL
    Packed: NULL
     Null: 
  Index_type: BTREE
   Comment: 
Index_comment: 
*************************** 2. row ***************************
    Table: test_data2
  Non_unique: 0
   Key_name: idx_uniq_name
 Seq_in_index: 1
 Column_name: name
  Collation: A
 Cardinality: 0
   Sub_part: NULL
    Packed: NULL
     Null: YES
  Index_type: BTREE
   Comment: 
Index_comment: 
2 rows in set (0.00 sec)

查看主鍵命名方法2:使用數(shù)據(jù)字典information_schema.statistics

使用命令的方式不夠通用,我們可以使用數(shù)據(jù)字典information_schema.statistics來進行數(shù)據(jù)提取。

mysql> select *from information_schema.statistics where table_schema='test' and table_name='test_data2' limit 20 \G        
*************************** 1. row ***************************
TABLE_CATALOG: def
 TABLE_SCHEMA: test
  TABLE_NAME: test_data2
  NON_UNIQUE: 0
 INDEX_SCHEMA: test
  INDEX_NAME: PRIMARY
 SEQ_IN_INDEX: 1
 COLUMN_NAME: id
  COLLATION: A
 CARDINALITY: 0
   SUB_PART: NULL
    PACKED: NULL
   NULLABLE: 
  INDEX_TYPE: BTREE
   COMMENT: 
INDEX_COMMENT: 
*************************** 2. row ***************************
TABLE_CATALOG: def
 TABLE_SCHEMA: test
  TABLE_NAME: test_data2
  NON_UNIQUE: 0
 INDEX_SCHEMA: test
  INDEX_NAME: idx_uniq_name
 SEQ_IN_INDEX: 1
 COLUMN_NAME: name
  COLLATION: A
 CARDINALITY: 0
   SUB_PART: NULL
    PACKED: NULL
   NULLABLE: YES
  INDEX_TYPE: BTREE
   COMMENT: 
INDEX_COMMENT: 
2 rows in set (0.00 sec)

查看主鍵命名方法3:使用show create table 命令

如果查看建表語句,會發(fā)現(xiàn)主鍵名已經(jīng)被過濾掉了。

mysql> show create table test_data2\G
*************************** 1. row ***************************
    Table: test_data2
Create Table: CREATE TABLE `test_data2` (
 `id` int(11) NOT NULL,
 `name` varchar(30) DEFAULT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `idx_uniq_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
有的同學(xué)可能想,是不是分別執(zhí)行了create,alter語句導(dǎo)致處理方式有差異,我們可以一步到位,在create語句里面聲明主鍵名。
CREATE TABLE `test_data3` (
 `id` int(11) NOT NULL,
 `name` varchar(30) DEFAULT NULL,
 PRIMARY KEY idx_pk_id(`id`),
 UNIQUE KEY `idx_uniq_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

這個時候查看建表語句,會發(fā)現(xiàn)結(jié)果和上面一樣,主鍵名都是PRIMARY.

mysql> show create table test_data3\G    
*************************** 1. row ***************************
    Table: test_data3
Create Table: CREATE TABLE `test_data3` (
 `id` int(11) NOT NULL,
 `name` varchar(30) DEFAULT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `idx_uniq_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

查看主鍵命名方法4:查看約束命名

當(dāng)然還有多種驗證方式,比如我們使用約束的方式來命名,得到的主鍵名都是PRIMARY.

CREATE TABLE IF NOT EXISTS `default_test` (
 `default_test`.`id` SMALLINT NOT NULL AUTO_INCREMENT,
 `default_test`.`name` LONGTEXT NOT NULL,
CONSTRAINT `pk_id` PRIMARY KEY (`id`)
);

查看主鍵命名方法5:使用DML報錯信息

當(dāng)然還有其他多種形式可以驗證,比如我們使用DML語句。

mysql> insert into test_data2 values(1,'aa');
Query OK, 1 row affected (0.02 sec)
mysql> insert into test_data2 values(1,'aa');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

以上的方法都可以讓我們對這個細節(jié)有更深入的理解,當(dāng)然我們可以再深入一些。

查看主鍵命名方法6:官方文檔

官方文檔里面其實包含了這個信息,但是不是很明顯。

關(guān)于主鍵的描述,大體內(nèi)容如下,有一條是專門做了聲明,主鍵名為PRIMARY.

  • 一個表只能有一個PRIMARY KEY。
  • PRIMARY KEY的名稱始終為PRIMARY,因此不能用作任何其他類型的索引的名稱。
  • 如果您沒有PRIMARY KEY,而應(yīng)用程序要求您在表中提供PRIMARY KEY,則MySQL將返回沒有NULL列的第一個UNIQUE索引作為PRIMARY KEY。
  • 在InnoDB表中,將PRIMARY KEY保持較短,以最小化輔助索引的存儲開銷。每個輔助索引條目都包含對應(yīng)行的主鍵列的副本。
  • 在創(chuàng)建的表中,首先放置一個PRIMARY KEY,然后放置所有UNIQUE索引,然后放置非唯一索引,這有助于MySQL優(yōu)化器確定使用哪個索引的優(yōu)先級,還可以更快地檢測重復(fù)的UNIQUE鍵。

查看主鍵命名方法7:源代碼

在sql_table.cc 里面對主鍵名稱做了定義聲明。

const char *primary_key_name="PRIMARY";

順著這條路,可以看到在不同層的實現(xiàn)中的一些邏輯情況。

小結(jié):

通過這樣的一些方式,我們對主鍵的命名情況有了一個整體的認(rèn)識,為什么會采用PRIMARY這樣一個命名呢,我總結(jié)了幾點:

1)統(tǒng)一命名可以理解是一種規(guī)范

2)和唯一性索引能夠區(qū)別開來,比如一個唯一性索引非空,從屬性上來看很相似的,通過主鍵命名就可以區(qū)分出來,在一些特性和索引使用場景中也容易區(qū)分。

3)主鍵是一個表索引的第一個位置,統(tǒng)一命名可以在邏輯判斷中更加清晰,包括字段升級為主鍵的場景等等。

4)在優(yōu)化器處理中也會更加方便,提高MySQL優(yōu)化器確定使用哪個索引的優(yōu)先級。

以上就是MySQL的主鍵命名策略相關(guān)的詳細內(nèi)容,更多關(guān)于MySQL 主鍵命名策略的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • MySQL不適合創(chuàng)建索引的11種情況示例分析

    MySQL不適合創(chuàng)建索引的11種情況示例分析

    這篇文章介紹了在MySQL中不適合創(chuàng)建索引的11種情況,本文通過示例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2025-02-02
  • 詳解MySQL中InnoDB的存儲文件

    詳解MySQL中InnoDB的存儲文件

    本篇是一篇關(guān)于MySQL專題知識點的內(nèi)容,詳細講述了InnoDB的存儲文件的相關(guān)內(nèi)容,感興趣的朋友學(xué)習(xí)下。
    2018-02-02
  • MySql獲取當(dāng)前時間并轉(zhuǎn)換成字符串的實現(xiàn)

    MySql獲取當(dāng)前時間并轉(zhuǎn)換成字符串的實現(xiàn)

    本文主要介紹了MySql獲取當(dāng)前時間并轉(zhuǎn)換成字符串的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • mysql數(shù)據(jù)庫在表中添加數(shù)據(jù)三種操作方式

    mysql數(shù)據(jù)庫在表中添加數(shù)據(jù)三種操作方式

    這篇文章主要介紹了mysql數(shù)據(jù)庫在表中添加數(shù)據(jù)三種方式,首先創(chuàng)建數(shù)據(jù)庫和表,創(chuàng)建完成后就可以進行添加數(shù)據(jù)的操作了,本文結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-08-08
  • MySQL 升級方法指南大全

    MySQL 升級方法指南大全

    通常,從一個發(fā)布版本升級到另一個版本時,我們建議按照順序來升級版本。例如,想要升級 MySQL 3.23 時,先升級到 MySQL 4.0,而不是直接升級到 MySQL 4.1 或 MySQL 5.0。
    2008-01-01
  • mysql日常鎖表之flush_tables詳解

    mysql日常鎖表之flush_tables詳解

    Flushtables和Flushtableswithreadlock是MySQL中的兩個命令,用于關(guān)閉表對象和清空查詢緩存,它們會等待所有正在運行的SQL請求執(zhí)行結(jié)束,如果請求操作的表集合為{tables},則會阻塞其他會話對{tables}表上的所有操作,包括查詢和寫操作
    2024-11-11
  • MySQL?中的權(quán)限管理及驗證流程

    MySQL?中的權(quán)限管理及驗證流程

    這篇文章主要介紹了MySQL?中的權(quán)限管理及驗證流程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • 深入JDBC sqlserver連接寫法的詳解

    深入JDBC sqlserver連接寫法的詳解

    本篇文章是對JDBC sqlserver的連接寫法進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • mysql?DISTINCT選取多個字段,獲取distinct后的行信息方式

    mysql?DISTINCT選取多個字段,獲取distinct后的行信息方式

    這篇文章主要介紹了mysql?DISTINCT選取多個字段,獲取distinct后的行信息方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • MySQL curdate()函數(shù)的實例詳解

    MySQL curdate()函數(shù)的實例詳解

    這篇文章主要介紹了MySQL curdate()函數(shù)的實例詳解的相關(guān)資料,希望通過本文能幫助到大家理解應(yīng)用MysqL curdate()的使用方法,需要的朋友可以參考下
    2017-09-09

最新評論

高平市| 嘉黎县| 嵊泗县| 虎林市| 屯门区| 南皮县| 沅陵县| 黄骅市| 阿拉善左旗| 化州市| 彭州市| 布拖县| 永德县| 长春市| 曲阜市| 西和县| 广汉市| 怀远县| 刚察县| 阳谷县| 泰州市| 芮城县| 屯昌县| 定边县| 湟中县| 定日县| 承德市| 嵩明县| 三门县| 临洮县| 大田县| 茌平县| 浑源县| 河北区| 平顺县| 丹棱县| 克山县| 两当县| 集贤县| 锦屏县| 嘉鱼县|