如何在mysql中拥有一系列唯一id

时间:2013-10-27 22:16:40

标签: php mysql auto-increment uniqueidentifier

我已经问过这个但是没找到我要找的东西,我有很多表,列id设置为自动递增和主键。

表1

id,title,condition ......

表2

id,title,condition ......

我有一个搜索框,我搜索产品,我的查询就像

 $stmt = $mysqli->prepare("select * from table1 where title Like ? or id = ? ");
 $stmt->bind_param('ss', $searchterm, $searchterm");
 $stmt->execute();

  $stmt = $mysqli->prepare("select * from table2 where title Like ? or id = ? ");
 $stmt->bind_param('ss', $searchterm, $searchterm");
 $stmt->execute();

因此,如果我搜索“1”,那么我将获得所有带有id或title 1的产品,但我想要的是每行都有一个唯一的标识符。我怎么能做到这一点?在我使用产品时,每种产品都应该有一个唯一的ID。

或者可以在id前面加一个字母,比如T1,T2,T3?

1 个答案:

答案 0 :(得分:1)

如果您使用的是Oracle表服务器,则可以使用名为SEQUENCE的数据库实体来获取表的数据库范围的唯一ID值。

在MySQL中模拟SEQUENCE实体很容易,即使它有点笨拙而且不太节省空间。

首先,创建一个这样的表。

CREATE TABLE sequence (
  sequence_id BIGINT NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`sequence_id`)
)

然后,创建其他表,这些表将使用这些唯一的sequence_id值。这是一个例子:

CREATE TABLE gadget (
  sequence_id BIGINT NOT NULL,
  gname VARCHAR(20) DEFAULT NULL,
  gvalue VARCHAR(20) DEFAULT NULL,
  PRIMARY KEY (sequence_id)
) 

这是另一个:

CREATE TABLE widget (
  sequence_id BIGINT NOT NULL,
  wname VARCHAR(20) DEFAULT NULL,
  wvalue VARCHAR(20) DEFAULT NULL,
  PRIMARY KEY (sequence_id)
) 

然后,每当你在其他表中插入一行时,就这样做:

INSERT INTO sequence () VALUES() ;
INSERT INTO widget (sequence_id, wname, wvalue) 
            VALUES (LAST_INSERT_ID(), 'whatever', 'you_want');

或者,对于另一个示例表,

INSERT INTO sequence () VALUES() ;
INSERT INTO gadget (sequence_id, gname, gvalue) 
            VALUES (LAST_INSERT_ID(), 'another', 'gadget');

诀窍是:当你将每个(看似空的)行插入sequence表时,它会更新自动增量sequence_id字段。然后,当您使用LAST_INSERT_ID()函数时,它会检索该sequence_id最近插入的值。

要非常小心地保持两个INSERT INTO语句连续,否则这将停止正常工作。

即使数据库服务器的许多不同客户端正在执行插入操作,这仍然有效,原因有两个:

  1. 自动增量是线程安全的。没有两个序列号可以相同。
  2. LAST_INSERT_ID()值为每个与MySQL数据库的不同连接保持一个值。不同的程序(或多线程Web应用程序中的不同线程)每个都有自己的连接,因此每个程序都有自己的LAST_INSERT_ID()值。
  3. 顺便说一下,我使用bigint数据作为序列,但int也可以正常工作。