2013-10-27 5 views
1

Я уже спрашивал об этом, но не получил то, что искал, у меня много таблиц со столбцом id, установленным для автоматического увеличения и первичного ключа.как иметь последовательность уникального id в mysql

Table1

идентификатор, название, состояние ...

Table2

идентификатор, название, состояние ...

И у меня есть окно поиска, где я искать продукты и мой запрос похож на

$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», тогда я получу все продукты с идентификатором или заголовком 1, но я хочу иметь уникальный идентификатор для каждой строки. Как я могу это сделать? Когда я работаю с продуктами, для каждого продукта должен быть уникальный идентификатор.

Или можно ли иметь алфавит перед идентификатором, что-то вроде T1, T2, T3?

+0

Это то, что для столбцов автоинкремента MySQL предназначены для: столбца автоинкремента - ваш уникальный идентификатор. В зависимости от используемого вами механизма базы данных вы также можете создать составной первичный ключ, включающий столбец автоинкремента с префиксом –

+0

@MarkBaker Okay, но в каждой таблице будет идентификатор 1, а когда я ищу 1, он будет возвращать столько же как количество продуктов. как я могу добавить префикс? – Lmxc

+1

Я не понимаю, что вы имеете в виду. Поскольку вы установили id в качестве первичного ключа. Это будет уникально. И ваш запрос показывает только одну таблицу сразу, поэтому я не понимаю, почему у вас будут дубликаты результатов. – Masadow

ответ

1

Если вы использовали сервер таблиц Oracle, вы должны использовать объект базы данных, называемый SEQUENCE, чтобы получить уникальное значение идентификатора базы данных для ваших таблиц.

Просто легко эмулировать объекты в MySQL, хотя, даже если они немного неуклюжи и не столь эффективны в пространстве.

Сначала создайте себе такой стол.

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, она обновляет поле auto-increment sequence_id. Затем, когда вы используете функцию LAST_INSERT_ID(), она извлекает самое последнее вставленное значение этой sequence_id.

Будьте очень осторожны, чтобы ваши два оператора INSERT INTO последовательно, или это перестанет работать должным образом.

Это работает, даже если многие разные клиенты сервера базы данных делают вставки по двум причинам;

  1. auto-increment является потокобезопасным. Никакие два порядковых номера не могут быть одинаковыми.
  2. LAST_INSERT_ID() значения поддерживаются по одному для каждого отдельного соединения с базой данных MySQL. Различные программы (или разные потоки в многопоточном веб-приложении) имеют свои собственные соединения, поэтому каждый из них имеет свои значения LAST_INSERT_ID().

Кстати, я использовал bigint данные для последовательности, но int будет работать так же хорошо.

Смежные вопросы