程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 基於MySql的擴大功效生玉成局ID

基於MySql的擴大功效生玉成局ID

編輯:MySQL綜合教程

基於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的相干材料,願望年夜家愛好。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved