欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

首先來(lái)復(fù)現(xiàn)下問(wèn)題,我們連接到數(shù)據(jù)庫(kù)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)建一個(gè)主鍵,命名為idx_pk_id,從執(zhí)行情況來(lái)看,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

為了進(jìn)一步對(duì)比,我們添加一個(gè)唯一性索引(輔助索引),來(lái)看看它們的差異。

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來(lái)進(jìn)行數(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 命令

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

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語(yǔ)句導(dǎo)致處理方式有差異,我們可以一步到位,在create語(yǔ)句里面聲明主鍵名。
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;

這個(gè)時(shí)候查看建表語(yǔ)句,會(huì)發(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)然還有多種驗(yàn)證方式,比如我們使用約束的方式來(lái)命名,得到的主鍵名都是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報(bào)錯(cuò)信息

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

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'

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

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

官方文檔里面其實(shí)包含了這個(gè)信息,但是不是很明顯。

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

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

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

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

const char *primary_key_name="PRIMARY";

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

小結(jié):

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

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

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

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

4)在優(yōu)化器處理中也會(huì)更加方便,提高M(jìn)ySQL優(yōu)化器確定使用哪個(gè)索引的優(yōu)先級(jí)。

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

相關(guān)文章

  • mysql死鎖(dead lock)與鎖等待(lock wait)的出現(xiàn)解決

    mysql死鎖(dead lock)與鎖等待(lock wait)的出現(xiàn)解決

    死鎖和鎖等待是數(shù)據(jù)庫(kù)運(yùn)維中常見(jiàn)的問(wèn)題,區(qū)別在于死鎖會(huì)自動(dòng)解除,而鎖等待需要手動(dòng)處理,本文就來(lái)介紹一下mysql死鎖(dead lock)與鎖等待(lock wait),感興趣的可以了解一下
    2024-09-09
  • MySQL中字符串函數(shù)詳細(xì)介紹

    MySQL中字符串函數(shù)詳細(xì)介紹

    通常以串的整體作為操作對(duì)象,如:在串中查找某個(gè)子串、求取一個(gè)子串、在串的某個(gè)位置上插入一個(gè)子串以及刪除一個(gè)子串等。
    2011-05-05
  • mysql(master/slave)主從復(fù)制原理及配置圖文詳解

    mysql(master/slave)主從復(fù)制原理及配置圖文詳解

    這篇文章主要介紹了mysql(master/slave)主從復(fù)制原理及配置圖文詳解,以前腳本之家小編發(fā)過(guò)相關(guān)的內(nèi)容,但這么好的非常少見(jiàn)特分享一下,需要的朋友可以參考下
    2016-05-05
  • 64位CentOs7源碼安裝mysql-5.6.35過(guò)程分享

    64位CentOs7源碼安裝mysql-5.6.35過(guò)程分享

    本文給大家分享的是在64位CentOs7系統(tǒng)中使用源碼安裝mysql-5.6.35的詳細(xì)過(guò)程,非常的細(xì)致,有需要的小伙伴可以參考下
    2017-02-02
  • 快速修復(fù)損壞的MySQL數(shù)據(jù)庫(kù)

    快速修復(fù)損壞的MySQL數(shù)據(jù)庫(kù)

    在長(zhǎng)時(shí)間使用 MySQL 后,數(shù)據(jù)庫(kù)可能會(huì)出現(xiàn)一些問(wèn)題。大多數(shù)問(wèn)題可以通過(guò)簡(jiǎn)單的操作進(jìn)行快速修復(fù)。下面介紹兩種快速檢修 MySQL 數(shù)據(jù)庫(kù)的方法。
    2011-06-06
  • 實(shí)操M(fèi)ySQL+PostgreSQL批量插入更新insertOrUpdate

    實(shí)操M(fèi)ySQL+PostgreSQL批量插入更新insertOrUpdate

    這篇文章主要介紹了MYsql和PostgreSQL優(yōu)勢(shì)對(duì)比以及如何實(shí)現(xiàn)MySQL + PostgreSQL批量插入更新insertOrUpdate,附含詳細(xì)的InserOrupdate代碼實(shí)例,需要的朋友可以參考下
    2021-08-08
  • mac 裝5.6版本mysql 設(shè)置密碼的簡(jiǎn)易方法

    mac 裝5.6版本mysql 設(shè)置密碼的簡(jiǎn)易方法

    這篇文章主要介紹了mac 裝5.6版本mysql 設(shè)置密碼的簡(jiǎn)易方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-05-05
  • MySQL 8.0.13 下載安裝教程圖文詳解

    MySQL 8.0.13 下載安裝教程圖文詳解

    這篇文章主要介紹了MySQL 8.0.13 下載安裝教程,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-11-11
  • MySQL查詢和修改auto_increment的方法

    MySQL查詢和修改auto_increment的方法

    這篇文章主要介紹了MySQL查詢和修改auto_increment的方法,實(shí)例分析了select查詢auto_increment及ALTER修改auto_increment的技巧,需要的朋友可以參考下
    2015-02-02
  • MySQL 8.0數(shù)據(jù)字典的初始化與啟動(dòng)流程

    MySQL 8.0數(shù)據(jù)字典的初始化與啟動(dòng)流程

    數(shù)據(jù)字典(Data Dictionary, DD)用來(lái)存儲(chǔ)數(shù)據(jù)庫(kù)內(nèi)部對(duì)象的信息,這些信息也被稱為元數(shù)據(jù)(Metadata),包括schema名稱、表結(jié)構(gòu)、存儲(chǔ)過(guò)程的定義等,本文主要介紹MySQL 8.0數(shù)據(jù)字典的基本概念和數(shù)據(jù)字典的初始化與啟動(dòng)加載的主要流程,需要的朋友可以參考下
    2024-06-06

最新評(píng)論