基於MySql的擴大功效生玉成局ID。本站提示廣大學習愛好者:(基於MySql的擴大功效生玉成局ID)文章只能為提供參考,不一定能成為您想要的結果。以下是基於MySql的擴大功效生玉成局ID正文
本文應用 MySQL的擴大功效 REPLACE INTO 來生玉成局id,REPLACE INTO和INSERT的功效一樣,然則當應用REPLACE INTO拔出新數據行時,假如新拔出的行的主鍵或獨一鍵(UNIQUE Key)已有的行反復時,已有的行會先被刪除,然後再將新數據行拔出(REPLACE INTO 是原始操作)。
樹立相似上面的表:
CREATE TABLE `tickets64` ( `id` bigint(20) unsigned NOT NULL auto_increment, `stub` char(1) NOT NULL default '', PRIMARY KEY (`id`), UNIQUE KEY `stub` (`stub`) ) ENGINE=MyISAM;
當須要取得全局獨一ID時,履行上面的SQL語句:
REPLACE INTO `tickets64` (`stub`) VALUES ('a'); SELECT LAST_INSERT_ID();
第一次履行這個語句後,ticket64表將包括以下數據:
+--------+------+
| id | stub |
+--------+------+
| 1 | a |
+--------+------+
今後再次履行後面的語句,stub字段值為'a'的行曾經存在,所以MySQL會先刪除這一行,再拔出。是以,第二次履行後,ticket64表照樣只要一行數據,只是id字段的值為2。這個表將一向只要一行數據。
更棒的辦法:
好比,只須要一張ticket表便可認為一切的營業表供給各自持續的ID。上面,來看一下我們的辦法。起首來看一下表構造:
CREATE TABLE `sequence` ( `name` varchar(50) NOT NULL, `id` bigint(20) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`name`) ) ENGINE=InnoDB;
留意差別,id字段不是自增的,也不是主鍵。在應用前,我們須要先拔出一些初始化數據:
INSERT INTO `sequence` (`name`) VALUES ('users'), ('photos'), ('albums'), ('comments');
接上去,我們可以經由過程履行上面的SQL語句來取得新的照片ID:
UPDATE `sequence` SET `id` = LAST_INSERT_ID(`id` + 1) WHERE `name` = 'photos'; SELECT LAST_INSERT_ID();
我們履行了一個更新操作,將id字段增長1,並將增長後的值傳遞到LAST_INSERT_ID函數,從而指定了LAST_INSERT_ID的前往值。
現實上,我們紛歧定須要事後指定序列的名字。假如我們如今須要一種新的序列,我們可以直接履行上面的SQL語句:
INSERT INTO `sequence` (`name`) VALUES('new_business') ON DUPLICATE KEY UPDATE `id` = LAST_INSERT_ID(`id` + 1); SELECT LAST_INSERT_ID();
這裡,我們采取了INSERT … ON DUPLICATE KEY UPDATE這個MySQL擴大,這個擴大的功效也和INSERT一樣拔出一行新的記載,然則當新拔出的行的主鍵或獨一鍵(UNIQUE Key)和已有的行反復時,會對已有行停止UPDATE操作。
當我們第一次履行下面的語句時,由於還沒有name為'new_business'的字段,所以正常的履行了拔出操作,須要留意的是經由過程這類方法獲得的序列肇端值為0,而不是1。由於第一次履行時,沒有履行UPDATE,所以也沒無為LAST_INSERT_ID傳遞值,我們也沒有自增字段,所以SELECT LAST_INSERT_ID()將前往0。不外這個應當不是甚麼年夜成績。
UPDATE: 這個辦法更輕易處理單點成績,也不局限於兩個辦事器,只需對分歧的辦事器設置分歧的初始值(但必需是持續的),然後將增質變為辦事器數就好了。
以上內容是基於MySql的擴大功效生玉成局ID的相干材料,願望年夜家愛好。