Как я получаю сначала неиспользованный идентификатор в таблице?

Используйте 24-часовое время, чтобы обойти проблему следующим образом:

$time = 1400;
$current_time = (int) date('Hi');
if($current_time < $time) {
    // do stuff
}

Таким образом, 2 часа дня равно 14:00 в 24-часовое время. Если мы удалим двоеточие из времени, то мы можем оценить его как целое число в нашем сравнении.

Для получения дополнительной информации о функции даты, пожалуйста, см. Руководство по PHP . Я использовал следующие форматеры времени:

H = 24-часовой формат часа (от 00 до 23)

i = минуты с ведущими нулями (от 00 до 59)

6
задан Quassnoi 25 May 2009 в 18:17
поделиться

3 ответа

Зависит от того, что вы подразумеваете под "следующим идентификатором" и как он генерируется.

Если вы используете последовательность или идентификатор в базе данных для создания идентификатора, возможно, что " next id "не 3 или 4, а 6 в случае, который вы представили. У вас нет возможности узнать, были ли впоследствии удалены значения с id 3 или 4. Последовательности и идентичности не обязательно пытаются восполнить пробелы; когда они ушли, вы не используете их повторно.

Итак, правильнее всего будет создать столбец последовательности или идентификатора в базе данных, который автоматически увеличивается при выполнении INSERT, а затем SELECT сгенерированное значение.

5
ответ дан 8 December 2019 в 18:41
поделиться

Я назвал вашу таблицу неиспользуемый .

SELECT  id
FROM    (
        SELECT  1 AS id
        ) q1
WHERE   NOT EXISTS
        (
        SELECT  1
        FROM    unused
        WHERE   id = 1
        )
UNION ALL
SELECT  *
FROM    (
        SELECT  id + 1
        FROM    unused t
        WHERE   NOT EXISTS
                (
                SELECT  1
                FROM    unused ti
                WHERE   ti.id = t.id + 1
                )
        ORDER BY
                id
        LIMIT 1
        ) q2
ORDER BY
        id
LIMIT 1

Этот запрос состоит из двух частей.

Первая часть:

SELECT  *
FROM    (
        SELECT  1 AS id
        ) q
WHERE   NOT EXISTS
        (
        SELECT  1
        FROM    unused
        WHERE   id = 1
        )

выбирает 1 , если в таблице нет записи с этим идентификатором .

Вторая часть:

SELECT  *
FROM    (
        SELECT  id + 1
        FROM    unused t
        WHERE   NOT EXISTS
                (
                SELECT  1
                FROM    unused ti
                WHERE   ti.id = t.id + 1
                )
        ORDER BY
                id
        LIMIT 1
        ) q2

выбирает первый id в таблице, для которой нет следующего id .

Результирующий запрос выбирает наименьшее этих двух значений.

6
ответ дан 8 December 2019 в 18:41
поделиться

можно ли иметь таблицу утилит? в таком случае я бы создал такую ​​таблицу:

CREATE TABLE number_helper (
    n INT NOT NULL
   ,PRIMARY KEY(n)
);

Заполните ее всеми положительными 32-битными целыми числами (при условии, что идентификатор, который вам нужно сгенерировать, является положительным 32-битным целым числом)

Затем вы можете выбрать так:

SELECT MIN(h.n) as nextID
FROM my_table t
LEFT JOIN number_helper h ON h.n = t.ID
WHERE t.ID IS NULL

Haven На самом деле не тестировал это, но он должен работать.

0
ответ дан 8 December 2019 в 18:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: