【问题标题】:MYSQL - how to a second unique string key?MYSQL - 如何获得第二个唯一的字符串键?
【发布时间】:2010-12-14 07:39:49
【问题描述】:

这是我的货物表。

+----------------------+---------------+------+-----+---------+-------+
| 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 是自动递增的。 GOODS 是商品类别的 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?

谢谢。

【问题讨论】:

  • 这种方法有什么具体原因吗?
  • 我真正的第一个问题是......为什么decimal,但为什么?

标签: mysql string key unique


【解决方案1】:

您可以使用 UNIQUE 约束。更多信息请查看here

【讨论】:

  • 添加 UNIQUE 约束很重要,以防止意外复制键。但是约束并不能帮助您首先生成密钥,因此您需要的不仅仅是这些。
【解决方案2】:

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

您可以从那里运行各种查询,另外还有一个好处是您的表具有参照完整性。

【讨论】:

  • 没有理由。这是我老板的要求。我只需要执行它。 ps:老板说这个设计跟Jira很像
  • 已经有一个从goods.goodsgood_categories.id的外键
【解决方案3】:

首先,您应该在数据库方面做所有事情。所以没有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, ...)

这样,您将始终有下一个可用号码。

【讨论】:

  • 这不是一个好的解决方案。如果他删除一条记录,COUNT(id) 将不再对应于最后插入的数字。我认为他需要更好地规范他的数据库,然后一切都会变得更容易。
  • 我同意。但也许他有一个客户订单,出于任何奇怪的原因想要这样。设计很糟糕,但在 MySQL 中没有序列来满足我可以提供的关闭答案的需求。你不同意吗?
  • 更好地规范化数据库?你能给我详细信息吗?我不知道。
  • @acai :对我来说,您不需要 GKEY 列,因为 is 代表什么?旁边的 GOODS ID 列的名称。因此,正如 AgentConundrum 所说,只有 Id、Categorie_Id、...、...、CreationDate、ModificationDate
  • @AgentConundrum:这是我老板的要求。我只需要执行它。 ps:老板说这个设计跟Jira很像
【解决方案4】:

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

  1. 在 GoodsCategory 表中,有一个计数器,它有助于生成下一个 gkey。
  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 manual 中的用法示例,其中讨论了如何使用锁来生成 ID 而不会受到其他进程的干扰。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2010-10-19
    • 2021-10-10
    • 2014-06-08
    • 1970-01-01
    相关资源
    最近更新 更多