Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL-如何创建第二个唯一的字符串键?_Mysql_String_Key_Unique - Fatal编程技术网

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。我会用以下两个设计点来设计它:

  • 在GoodsCategory表中,有一个计数器,它有助于生成下一个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
    添加一个唯一的约束很重要,以防止意外复制键。但是约束在一开始并不能帮助您生成关键点,因此您需要的不仅仅是这些。