1

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

表格1

id、标题、条件...

表2

id、标题、条件...

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

 $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 或标题 1 的产品,但我想要的是每行都有一个唯一的标识符。我怎样才能做到这一点?当我使用产品时,每个产品都应该有一个唯一的 ID。

或者是否有可能在 id 前面有一个字母,例如 T1、T2、T3?

4

1 回答 1

2

如果您使用的是 Oracle 表服务器,您将使用名为 a 的数据库实体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().

顺便说一句,我使用bigint了序列的数据,但 int也可以正常工作。

于 2013-10-28T12:42:20.883 回答