Вы можете сделать это, но вам нужно быть очень осторожным, чтобы убедиться, что две одновременные вставки не получают один и тот же ключ. Я бы разработал его с этими двумя точками дизайна:
- В таблице GoodsCategory есть счетчик , который помогает создать следующий ключ.
- Используйте блокировки , чтобы только один процесс мог генерировать новый ключ одновременно.
Вот подробности:
1. Добавьте пару столбцов в таблицу GoodsCategory:
+----------------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------------+---------------+------+-----+---------+-------+
| ID | TINYINT | NO | PRI | | |
| NAME | VARCHAR(80) | NO | | | |
| KeyCode | CHAR(5) | NO | | | |
| NextID | INT | NO | | 0 | |
+----------------------+---------------+------+-----+---------+-------+
KeyCode имеет 'BOOK' или 'PHONE', а поле NextID хранит int, которое используется для генерации следующего ключа этого типа, то есть, если таблица выглядит следующим образом:
+----------------+------------+---------+--------+
| ID | NAME | KeyCode | NextID |
+----------------+------------+---------+--------+
| 1 | book | BOOK | 3 |
| 2 | phone | PHONE | 7 |
+----------------+------------+---------+--------+
Затем в следующий раз, когда вы добавите книгу, ей нужно дать gkey 'BOOK-3', а NextID увеличится до 4.
2: блокировку необходимо будет выполнить в хранимой подпрограмме , поскольку она включает в себя несколько операторов в транзакции и также использует локальные переменные. Ядро должно выглядеть примерно так:
START TRANSACTION;
SELECT KeyCode, NextID INTO v_kc, v_int FROM GoodsCategory WHERE ID = 2 FOR UPDATE;
SET v_newgkey = v_kc + '-' + CAST(v_int AS CHAR);
INSERT INTO goods (gkey, goods, ...) VALUES (v_newgkey, 2, etc);
UPDATE GoodsCategory SET NextID = NextID + 1 WHERE ID = 2;
COMMIT;
Бит FOR UPDATE
имеет решающее значение; взгляните на примеры использования в руководстве mysql , где обсуждается, как использовать блокировки для генерации идентификатора без вмешательства другого процесса.