【问题标题】:How can I get a number from 1 that is unused in database如何从 1 中获取数据库中未使用的数字
【发布时间】:2012-06-21 22:05:23
【问题描述】:

您好,我的问题是如何获取特定数据库行中未使用的第一个数字。该数字必须介于 1 和 9999 之间,并且必须与该特定数据库行中的所有数字进行比较,因此如果我的数据库行中的数据以 5 开头,我将无法获得第一个未使用的数字 ...in在这种情况下是数字 1。然后当我创建带有数字 1 的数据时。我需要获取的下一个数字是 2 并且...我正在使用它来创建配置文件,该数字是配置文件编号,以及新的配置文件必须有数据库中第一个未使用的数字。怎么做。我不知道从哪里开始。那么,如果有人能让我走上解决这个问题的正确道路吗?谢谢。

编辑

但是,我不需要用户自己选择这个数字所需的自动增量,首先,必须通过将第一个数字放在文本表单中向用户建议。如果用户选择了数据库中已经存在的号码,我的程序会让用户知道他正在尝试选择已经存在的号码。因此,如果您了解我的话……我知道 mysql 的基础知识。当用户删除一个配置文件然后删除的号码不能再使用时,问题就出现了。为此,我需要功能首先释放未使用的号码。

新编辑

我会尝试澄清一些细节...首先这是人力资源程序,用户创建工人的档案...当用户创建新的 dosie hee 需要为此选择 dosie 编号工人,现在我需要为新的 dosie 使用第一个未使用的号码... dosie 号码不是 dosie 'id'。剂量号码必须由用户手动选择,否则他可以让第一个免费号码给新剂量...我认为这会清除一些事情

【问题讨论】:

  • 我并没有真正得到你想要做的事情。但是您尝试过什么?
  • 你能举个例子吗?

标签: php mysql


【解决方案1】:

您可能正在谈论表行的自动增量主键。只需插入数据,无需指定此“数字”,数据库会自动将其设置为正确的(下一个空闲)值。

不要重用主键(例如,您有 1、2、3、4、5,但随后删除了 3 - 如果您重用 3,您将不会知道 3 是实际删除的其他记录)。

顺便说一句,这是非常基本的数据库知识。阅读一些关于 MySQL 或任何其他 SQL 关系数据库的介绍教程。

【讨论】:

  • 现在我又读了几次这个问题,我认为这就是答案:)
  • @Veseliq 但我不需要用户能够选择这个数字的自动增量,首先必须向用户建议这个第一个数字。如果用户选择数据库中已经存在的号码,我的程序会让用户知道他正在尝试选择已经存在的号码。所以,如果你理解我的话……我知道 mysql 的基础知识。
  • 请注意,它可以重用PK,但它涉及到有一个特殊的列指示该行是否已被删除,并查询表以找到第一行使用该列集。但这也涉及锁定表以防止行上的竞争条件! ...我只是说:)
【解决方案2】:

您正在尝试使用错误的数据库。

也许你可以看看这个:Finding the next available id in MySQL

【讨论】:

    【解决方案3】:

    首先创建一个值为 1 到 9999 的表。然后,运行此查询一次:

    delete from table where id IN (select id from profiles)
    

    这样,您将获得不在配置文件表中的 ID。第一个可以显示给用户。保存记录时,请务必从该表中删除该 ID。

    如果我理解正确,这就是你要找的。​​p>

    【讨论】:

    • 看你很亲密,尝试清除一些细节...首先这是人力资源程序,用户输入带有工人信息的工人的档案...当用户创建新的dosie hee 需要为这个工人选择 dosie 编号,现在我不会建议用户为新 dosie 使用第一个未使用的编号... dosie 编号不是 dosie 'id'。剂量号码必须由用户手动选择,否则他可以让第一个免费号码给新剂量...我认为这会清除一些事情
    • 好的。那么问题是什么?创建一个只有从 1 到 9999 的 ID 的表格 dosie,然后按照我说的做。如果所有使用的行都被删除,那么你有一个未使用的 dosies 的表。 (顺便说一句,什么是dosie?):(
    • 您将如何处理多个用户?如果 2 个人同时访问该应用程序,他们将获得相同的 ID(Dosie 编号)。不会造成问题吗?
    • 是的,我了解你,但可以在不创建另一个数字从 1 到 9999 的表的情况下做到这一点吗?例如可以单独由php完成吗?对于多个用户,我拥有用户帐户和管理员帐户,只有管理员才能创建 dosie……Dosie 是各种工人数据的集合……
    • 没有,据我所知。实际上,我昨天发布了一个类似的问题,但后来发现它是完全重复的,所以将其删除。创建另一个表是最简单和最快的方法。另一种方法是创建一个 MySQL do..while 循环并检查表中是否存在每个数字。这会给服务器带来很多负载。
    【解决方案4】:

    如果您仅限于使用 1 到 9999 之间的值,我可能会按如下方式设置流程:

    1. 添加另一个包含两列的表 (id_tracker)。
    2. 使用 id 的 1 到 9999 填充 id_tracker,默认 is_used 为 0。
    3. 根据your table的内容将id_tracker.is_used更新为1。
    4. 添加删除、插入触发器到your table 以根据需要更新id_tracker
    5. 并选择空ID如下SELECT id FROM id_tracker WHERE is_used = 0 ORDER BY id LIMIT 1

    这里有一些 SQL 可以帮助您入门:

    create table id_tracker
    (id int not null, is_used tinyint default 0, primary key (id));
    
    delimiter |
    
    CREATE TRIGGER your_table_delete_trigger BEFORE DELETE ON your_table
      FOR EACH ROW
      BEGIN
          UPDATE id_tracker SET is_used = 0 WHERE id = OLD.your_table_id;
      END;
    |
    
    CREATE TRIGGER your_table_insert_trigger AFTER INSERT ON your_table
      FOR EACH ROW
      BEGIN
          UPDATE id_tracker SET is_used = 1 WHERE id = NEW.your_table_id;
      END;
    |
    
    delimiter ;
    

    ** 注意:以上是针对 MySQL 的

    【讨论】:

      猜你喜欢
      • 2019-12-08
      • 1970-01-01
      • 2011-11-06
      • 2020-06-14
      • 2017-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多