我已经问过这个但是没找到我要找的东西,我有很多表,列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?
答案 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
语句连续,否则这将停止正常工作。
即使数据库服务器的许多不同客户端正在执行插入操作,这仍然有效,原因有两个:
LAST_INSERT_ID()
值为每个与MySQL数据库的不同连接保持一个值。不同的程序(或多线程Web应用程序中的不同线程)每个都有自己的连接,因此每个程序都有自己的LAST_INSERT_ID()
值。顺便说一下,我使用bigint
数据作为序列,但int
也可以正常工作。