Если вы использовали сервер таблиц 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
последовательно, или это перестанет работать должным образом.
Это работает, даже если многие разные клиенты сервера базы данных делают вставки по двум причинам;
- auto-increment является потокобезопасным. Никакие два порядковых номера не могут быть одинаковыми.
LAST_INSERT_ID()
значения поддерживаются по одному для каждого отдельного соединения с базой данных MySQL. Различные программы (или разные потоки в многопоточном веб-приложении) имеют свои собственные соединения, поэтому каждый из них имеет свои значения LAST_INSERT_ID()
.
Кстати, я использовал bigint
данные для последовательности, но int
будет работать так же хорошо.
Это то, что для столбцов автоинкремента MySQL предназначены для: столбца автоинкремента - ваш уникальный идентификатор. В зависимости от используемого вами механизма базы данных вы также можете создать составной первичный ключ, включающий столбец автоинкремента с префиксом –
@MarkBaker Okay, но в каждой таблице будет идентификатор 1, а когда я ищу 1, он будет возвращать столько же как количество продуктов. как я могу добавить префикс? – Lmxc
Я не понимаю, что вы имеете в виду. Поскольку вы установили id в качестве первичного ключа. Это будет уникально. И ваш запрос показывает только одну таблицу сразу, поэтому я не понимаю, почему у вас будут дубликаты результатов. – Masadow