MYSQL - 如何获得第二个唯一的字符串键?

时间:2010-12-14 07:39:49

标签: mysql string key unique

这是我的货物表。

+----------------------+---------------+------+-----+---------+-------+
| 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    |       |

列ID是自动递增的。 商品是商品类别的ID。 这是商品类别表。

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

我的问题是在商品表中我需要gkey也是一个带有前缀id的唯一键(这里id从1开始。)像BOOK-1,BOOK-2 .... PHONE-1,PHONE-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  |         |       |
+--------------------+---------------+------+-----+---------+-------+ 

如何在PHP + MYSQL中获取GKEY?

感谢。

4 个答案:

答案 0 :(得分:0)

您可以使用UNIQUE约束。有关详细信息,请查看here

答案 1 :(得分:0)

我认为你根本不想这样做。相反,good.gkey应该是goods_category.id的外键。如果插入订单很重要,您可以在货物表中添加insert_date日期字段。

从那里你可以运行各种各样的查询,还有额外的好处,即在你的桌子上具有参照完整性。

答案 2 :(得分:0)

首先你应该做一切数据库方面。所以没有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, ...)

这样您将始终拥有下一个号码。

答案 3 :(得分:0)

你可以这样做,但你需要非常小心,以确保两个同时插入不会得到相同的gkey。我用这两个设计点设计它:

  1. 在GoodsCategory表中,有一个计数器,这有助于生成下一个gkey。
  2. 使用,这样任何时候只有一个进程可以生成新密钥。
  3. 以下是详细信息:
    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 manual中的用法示例,其中讨论了如何使用锁生成ID而不受其他进程的干扰。