mysql 获取全局唯一值_MySQL

Jun 01, 2016 pm 01:26 PM
mysql データベース

bitsCN.com

  在涉及数据库存储数据的时候,经常会遇到唯一值问题,有的是主键带来的限制,有的则是业务上的需要。

  下面介绍几种唯一值的获取或者生产方法:

  先建一个测试用的表tbl_user,有三个字段:Id、Name、Age,其中Id为主键。
   1:  drop table if exists `tbl_user`;
ログイン後にコピー
   2:  create table 
ログイン後にコピー
   3:  `tbl_user` (
ログイン後にコピー
   4:      `Id` int(10),
ログイン後にコピー
   5:      `Name` varchar(20),
ログイン後にコピー
   6:      `Age` int(10),
ログイン後にコピー
   7:      PRIMARY KEY  (`Id`)
ログイン後にコピー
   8:  )DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
ログイン後にコピー
 
ログイン後にコピー
ログイン後にコピー

  插入几条数据

   1:  insert into tbl_user values (1000,"小猫",22);
ログイン後にコピー
   2:  insert into tbl_user values (1001,"小狗",22);
ログイン後にコピー
   3:  insert into tbl_user values (1002,"小刺猬",22);
ログイン後にコピー
   4:   
ログイン後にコピー
   5:  select * from tbl_user;
ログイン後にコピー
  查询结果:
ログイン後にコピー
  <img src="/static/imghw/default1.png" data-src="http://img.bitscn.com/upimg/allimg/c140719/1405L22201W50-23L24.jpg" class="lazy"   style="max-width:90%" title="image" alt="image"  style="max-width:90%"  style="max-width:90%" border="0">
ログイン後にコピー
 
ログイン後にコピー
ログイン後にコピー
  1.由应用程序根据一定算法生成唯一值:一般采用”MD5(时间戳+随机数)“或者其他的UUID算法,基本也比较好实现。如果遇到多机器上分布的程序访问统一数据库的表,可以把Ip、网卡号等信息考进来就可以解决了(当然可以不是简单的拼接,你可以根据需要去合适的位数经过一定的算法去获取)。 

  2.先查询表中最大的值select max(id),再加1后作为新的值。很笨的方法。

   1:  select max(Id) from tbl_user;
ログイン後にコピー
   2:  查询到的最大Id为 1002
ログイン後にコピー
   3:   
ログイン後にコピー
   4:  之后插入 1003
ログイン後にコピー
   5:   
ログイン後にコピー
   6:  insert into tbl_user values (1003,"小熊",22);
ログイン後にコピー
   7:   
ログイン後にコピー

  此时表中数据为

  image

  3.如果是表级别的唯一,即在同一个表中某个字段唯一,可以把该字段设置为“自增(AUTO_INCREMENT)”的。这样你不必费心思去生成这个不能重复的唯一值了。但是一般应用程序是需要这个唯一值的,这个时候你就得在查询一次去获取刚才数据库自增生成的Id。比如在用户登录的时候,你要生成一个登录会话Id或者Token,这些程序一般是需要得到这个值而不是仅仅存在数据库中。生成的值,1.可以一般的select条件查询,根据条件查询刚才插入的数据。2.直接调用select @@IDENTITY 就可以得到上一次插入记录时自动产生的ID(注意是在数据库同一个连接(会话)中),用在插入后立即select @@IDENTITY 。

  看例子,先将表中的Id字段设置为自增,再插入一条数据(不要插入Id值,让数据库自增得到值),select @@IDENTITY查询,最后验证看看。

1.#将Id改为自增(auto_increment)ALTER TABLE tbl_user CHANGE Id Id int not null auto_increment;#或者 先删除Id字段再添加一个Id字段alter table tbl_user auto_increment=1000;alter table tbl_user drop column Id;alter table tbl_user add Id int not null auto_increment primary key first;2.插入一条记录insert tbl_user set Name='小猴',Age=23;3.查询刚才的自增Id值select @@IDENTITY;值是1004,
ログイン後にコピー


  验证下:select * from tbl_user;得到的当前表记录为

  image

  过刚插入的数据“小猴”id为1004,和select @@IDENTITY;结果一样。

  4.使用mysql的 UUID()函数。前面的自增字段(auto_increment)只能生成”表内”的唯一值,且需要搭配使其为”唯一的主键或唯一索引”,它的值是逐步增长的。这里的UUID产生的是字符串类型值,固定长度为:36个字符。UUID生成的是在时间、空间上都独一无二的值,是“随机+规则”组合而成。

select uuid();select uuid();执行两次,结果:69ad8b74-6d47-11e3-ba6e-7446a08ee8ec69b03c16-6d47-11e3-ba6e-7446a08ee8ec
ログイン後にコピー

  可以看到,多次调用UUID()函数得到的值不相同,它由五部分组成,并且有连字符(-)隔开,一共36个字符。其中:

  前3组值是时间戳换算过来的,解决“时间上唯一”;

  第4组值是暂时性保持时间戳的唯一性,重启mysql才会变动;

  第5组是mac值转过来的,有助于解决“空间上的唯一”,同一个机器多实例的一般相同。如果mac值获取不到,则是一个随机值。

  这些已经可以保证得到的值在时间和空间上的唯一。当然你也可以去掉连字符: select replace(uuid(),'-','')。

  在MySQL 5.1.*及更高版本有一个变种的UUID()函数,UUID_SHORT(),可以生成一个17-64位无符号的整数,注意是生成的一个整数,而前面UUID()生成的是字符串。MySQL启动后第一次执行的值是通过时间戳等初始化这个值,在本次运行中再次调用的时候都加1。这个值一般比较大,可以调用right(UUID_SHORT(),9)取后面的若干位。或者,你还可以写成自定义函数,来按需生成这个值。举个例子:

#1.调用uuid_short()函数SELECT UUID_SHORT();SELECT UUID_SHORT();#执行两次得到的值递增的:2328563497408921623285634974089217#2.创建一个自定义函数,按需获取唯一值:CREATE DEFINER=`root`@`%` FUNCTION `GetUuidTest`(SysId     int) RETURNS int(10)begin    declare tmpID  int;                set tmpID = 0;              #SELECT UUID_SHORT() into  tmpID;  #直接取值     SELECT concat(SysId,right(UUID_SHORT(),8)) into  tmpID;#SysId和UUID_SHORT()后8位数拼接得到     return  tmpID;end#3.调用自定义的函数GetUuidTest(int)函数:select GetUuidTest(1);select GetUuidTest(1);select GetUuidTest(2);select GetUuidTest(2);#得到结果:174089233 #1+uuid_short()后8位(74089233)组成174089234 #1+uuid_short()后8位(74089234)组成274089235 #2+uuid_short()后8位(74089235)组成274089236 #3+uuid_short()后8位(74089236)组成#uuid_short()值递增,前面在加一个Id,不同的服务器IdSysId不同。#4.在例子中调用自定义函数GetUuidTest(int)  来插入记录:这时候不需要把Id设置为自增了。insert tbl_user set Id=GetUuidTest(1),Name='小熊猫',Age=22;insert tbl_user set Id=GetUuidTest(2),Name='小鸭子',Age=21;
ログイン後にコピー

  例子中,select * from tbl_user;得到的所有记录为

  image

  欢迎转载,方便的话,请注明出处,谢谢!

  作者:子韦一

bitsCN.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHP で MySQL のバックアップと復元を使用するにはどうすればよいですか? PHP で MySQL のバックアップと復元を使用するにはどうすればよいですか? Jun 03, 2024 pm 12:19 PM

PHP で MySQL データベースをバックアップおよび復元するには、次の手順を実行します。 データベースをバックアップします。 mysqldump コマンドを使用して、データベースを SQL ファイルにダンプします。データベースの復元: mysql コマンドを使用して、SQL ファイルからデータベースを復元します。

PHP で MySQL クエリのパフォーマンスを最適化するにはどうすればよいですか? PHP で MySQL クエリのパフォーマンスを最適化するにはどうすればよいですか? Jun 03, 2024 pm 08:11 PM

MySQL クエリのパフォーマンスは、検索時間を線形の複雑さから対数の複雑さまで短縮するインデックスを構築することで最適化できます。 PreparedStatement を使用して SQL インジェクションを防止し、クエリのパフォーマンスを向上させます。クエリ結果を制限し、サーバーによって処理されるデータ量を削減します。適切な結合タイプの使用、インデックスの作成、サブクエリの使用の検討など、結合クエリを最適化します。クエリを分析してボトルネックを特定し、キャッシュを使用してデータベースの負荷を軽減し、オーバーヘッドを最小限に抑えます。

PHP を使用して MySQL テーブルにデータを挿入するにはどうすればよいですか? PHP を使用して MySQL テーブルにデータを挿入するにはどうすればよいですか? Jun 02, 2024 pm 02:26 PM

MySQLテーブルにデータを挿入するにはどうすればよいですか?データベースに接続する: mysqli を使用してデータベースへの接続を確立します。 SQL クエリを準備します。挿入する列と値を指定する INSERT ステートメントを作成します。クエリの実行: query() メソッドを使用して挿入クエリを実行します。成功すると、確認メッセージが出力されます。

PHP を使用して MySQL テーブルを作成するにはどうすればよいですか? PHP を使用して MySQL テーブルを作成するにはどうすればよいですか? Jun 04, 2024 pm 01:57 PM

PHP を使用して MySQL テーブルを作成するには、次の手順が必要です。 データベースに接続します。データベースが存在しない場合は作成します。データベースを選択します。テーブルを作成します。クエリを実行します。接続を閉じます。

PHP で MySQL ストアド プロシージャを使用するにはどうすればよいですか? PHP で MySQL ストアド プロシージャを使用するにはどうすればよいですか? Jun 02, 2024 pm 02:13 PM

PHP で MySQL ストアド プロシージャを使用するには: PDO または MySQLi 拡張機能を使用して、MySQL データベースに接続します。ストアド プロシージャを呼び出すステートメントを準備します。ストアド プロシージャを実行します。結果セットを処理します (ストアド プロシージャが結果を返す場合)。データベース接続を閉じます。

MySQL 8.4 で mysql_native_password がロードされていないエラーを修正する方法 MySQL 8.4 で mysql_native_password がロードされていないエラーを修正する方法 Dec 09, 2024 am 11:42 AM

MySQL 8.4 (2024 年時点の最新の LTS リリース) で導入された主な変更の 1 つは、「MySQL Native Password」プラグインがデフォルトで有効ではなくなったことです。さらに、MySQL 9.0 ではこのプラグインが完全に削除されています。 この変更は PHP および他のアプリに影響します

iOS 18では、紛失または破損した写真を復元するための新しい「復元」アルバム機能が追加されます iOS 18では、紛失または破損した写真を復元するための新しい「復元」アルバム機能が追加されます Jul 18, 2024 am 05:48 AM

Apple の最新リリースの iOS18、iPadOS18、および macOS Sequoia システムでは、さまざまな理由で紛失または破損した写真やビデオをユーザーが簡単に回復できるように設計された重要な機能が写真アプリケーションに追加されました。この新機能では、写真アプリのツール セクションに「Recovered」というアルバムが導入され、ユーザーがデバイス上に写真ライブラリに含まれていない写真やビデオがある場合に自動的に表示されます。 「Recovered」アルバムの登場により、データベースの破損、カメラ アプリケーションが写真ライブラリに正しく保存されない、または写真ライブラリを管理するサードパーティ アプリケーションによって失われた写真やビデオに対する解決策が提供されます。ユーザーはいくつかの簡単な手順を実行するだけで済みます

PHP で MySQLi を使用してデータベース接続を確立するための詳細なチュートリアル PHP で MySQLi を使用してデータベース接続を確立するための詳細なチュートリアル Jun 04, 2024 pm 01:42 PM

MySQLi を使用して PHP でデータベース接続を確立する方法: MySQLi 拡張機能を含める (require_once) 接続関数を作成する (functionconnect_to_db) 接続関数を呼び出す ($conn=connect_to_db()) クエリを実行する ($result=$conn->query()) 閉じる接続 ( $conn->close())

See all articles