MYSQL-如何创建第二个唯一的字符串键?
这是我的货物台MYSQL-如何创建第二个唯一的字符串键?,mysql,string,key,unique,Mysql,String,Key,Unique,这是我的货物台 +----------------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------------+---------------+------+-----+---------+-------+ | ID | d
+----------------------+---------------+------+-----+---------+-------+
| 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
谢谢。您可以使用唯一约束。有关更多信息,请查看。我认为您根本不想这样做。相反,
good.gkey
应该是goods\u category.id
的外键。如果插入订单很重要,则可以将insert_date
date字段添加到商品表中
+----------------------+---------------+------+-----+---------+-------+
| 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 | |
从那里,您可以运行各种查询,并在表上具有引用完整性。首先,您应该在数据库端执行所有操作。所以没有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, ...)
这样,您将始终有下一个可用的数字。您可以这样做,但您需要非常小心,以确保两个同时插入不会得到相同的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,该int用于生成该类型的下一个键,即,如果表如下所示:
+----------------+------------+---------+--------+
| ID | NAME | KeyCode | NextID |
+----------------+------------+---------+--------+
| 1 | book | BOOK | 3 |
| 2 | phone | PHONE | 7 |
+----------------+------------+---------+--------+
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;
然后,下次添加一本书时,它应该被赋予gkey“book-3”,NextID递增为4
2.锁定需要在存储例程中完成,因为它在事务中涉及多个语句,并且也使用局部变量。它的核心应该是这样的:
+----------------+------------+---------+--------+
| ID | NAME | KeyCode | NextID |
+----------------+------------+---------+--------+
| 1 | book | BOOK | 3 |
| 2 | phone | PHONE | 7 |
+----------------+------------+---------+--------+
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;
更新的
位至关重要;请看中的使用示例,其中讨论了如何在不受其他进程干扰的情况下使用锁生成ID。这种方法的具体原因是什么?我真正的第一个问题是。。。为什么是十进制,但为什么?这不是一个好的解决方案。如果他删除一条记录,COUNT(id)
将不再与插入的最后一个数字对应。我认为他需要更好地规范他的数据库,然后其他一切都会变得更容易。我同意。但也许他有一个客户订单,出于某种奇怪的原因,他希望这样做。这个设计很糟糕,但是MySQL中没有序列来满足它的需求,这是我可以提供的答案。你不同意吗?更好地规范化数据库?你能告诉我细节吗。我不知道。@acai:对我来说,你不需要GKEY专栏,因为它代表什么?它旁边的商品ID列的名称。所以,正如代理大会上所说,只要有Id,Categorie_Id,…,CreationDate,ModificationDate@AgentConundrum这是我老板的要求。我只需要执行它。ps:老板说这个设计类似于吉拉诺的原因。这是我老板的要求。我只需要执行它。ps:Boss说这种设计类似于Jirate这里已经有了一个来自商品的外键。商品
到好的类别。id
添加一个唯一的约束很重要,以防止意外复制键。但是约束在一开始并不能帮助您生成关键点,因此您需要的不仅仅是这些。