这是我的货物表。
+----------------------+---------------+------+-----+---------+-------+
| 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?
感谢。
答案 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表中添加几列:
+----------------------+---------------+------+-----+---------+-------+
| 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而不受其他进程的干扰。