MYSQL - как получить второй уникальный строковый ключ? - PullRequest
1 голос
/ 14 декабря 2010

Вот моя таблица товаров.

+----------------------+---------------+------+-----+---------+-------+
| Field                | Type          | Null | Key | Default | Extra |
+----------------------+---------------+------+-----+---------+-------+
| ID                   | decimal(18,0) | NO   | PRI |         |       |
| gkey                 | varchar(255)  | YES  | MUL | NULL    |       |
| GOODS                | decimal(18,0) | YES  | MUL | NULL    |       |

Идентификатор столбца - автоинкремент.GOODS - это идентификатор категории товаров.Вот таблица категорий товаров.

+-------+---------------------+
| ID    | NAME                |
+-------+---------------------+
| 1     | book                |
| 2     | phone               |
+-------+---------------------+

Мой вопрос в таблице товаров. Мне нужен gkey, это также уникальный ключ с идентификатором префикса (здесь идентификатор начинается с 1.) Как BOOK-1, BOOK-2 .... ТЕЛЕФОН-1, ТЕЛЕФОН-2 ... при вставке новой записи товара в таблицу товаров.Вот так:

+--------------------+---------------+------+-----+---------+-------+
| ID                 | GKEY          |GOODS | PRI | COUNTRY | Extra |
+--------------------+---------------+------+-----+---------+-------+
| 1                  | BOOK-1        | 1    | 10  |         |       |
| 2                  | PHONE-1       | 2    | 12  |         |       |
| 3                  | BOOK-2        | 1    | 13  |         |       |
| 4                  | BOOK-3        | 1    | 10  |         |       |
| 5                  | PHONE-2       | 2    | 10  |         |       |
| 6                  | PHONE-3       | 2    | 20  |         |       |
+--------------------+---------------+------+-----+---------+-------+ 

Как получить этот GKEY в PHP + MYSQL?

спасибо.

Ответы [ 4 ]

0 голосов
/ 14 декабря 2010

Вы можете сделать это, но вам нужно быть очень осторожным, чтобы убедиться, что две одновременные вставки не получают один и тот же ключ. Я бы разработал его с этими двумя точками дизайна:

  1. В таблице GoodsCategory есть счетчик , который помогает создать следующий ключ.
  2. Используйте блокировки , чтобы только один процесс мог генерировать новый ключ одновременно.

Вот подробности:
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 , где обсуждается, как использовать блокировки для генерации идентификатора без вмешательства другого процесса.

0 голосов
/ 14 декабря 2010

Я не думаю, что вы вообще хотите этим заниматься.Вместо этого good.gkey должен быть внешним ключом для goods_category.id.Если порядок вставки важен, вы можете добавить поле даты insert_date в таблицу товаров.

Оттуда вы можете запускать все виды запросов с дополнительным бонусом наличия ссылочной целостности в ваших таблицах.

0 голосов
/ 14 декабря 2010

Сначала вы должны сделать все, что касается базы данных.Так что нет php.Это был бы мой совет.

Тогда, не имея последовательности в MySQL, то, что я бы предложил Вам:

SELECT COUNT(id)
FROM GOODS
WHERE GKEY LIKE('BOOK-%')

Затем вы вставляете

INSERT INTO goods (id, "BOOK-" || SELECT MAX(SUBSTR(LENGTH(GKEY -1), LENGTH(GKEY))FROM GOODS WHERE GKEY LIKE('BOOK-%') + 1, ...)

Таким образом, вы будетевсегда иметь следующий доступный номер.

0 голосов
/ 14 декабря 2010

Вы можете использовать УНИКАЛЬНОЕ ограничение. Для получения дополнительной информации проверьте здесь .

...