Нахождение следующего доступного идентификатора в MySQL

Чтобы проверить, не возвратил ли JavaScript в nonexistant.js ошибки, необходимо добавить переменную в http://fail.org/nonexistant.js как var isExecuted = true; и затем проверить, существует ли он, когда тег script загружается.

Однако, если Вы только хотите проверить, что эти nonexistant.js возвратился без 404 (значение его существует), можно попробовать isLoaded переменная...

var isExecuted = false;
var isLoaded = false;
script_tag.onload = script_tag.onreadystatechange = function() {
    if(!this.readyState ||
        this.readyState == "loaded" || this.readyState == "complete") {
        // script successfully loaded
        isLoaded = true;

        if(isExecuted) // no error
    }
}

Это покроет оба случая.

52
задан OMG Ponies 10 September 2009 в 03:41
поделиться

9 ответов

Я не думаю, что вы когда-нибудь можете быть уверены в следующем идентификаторе, потому что кто-то может вставить новую строку сразу после того, как вы запросили следующий идентификатор. По крайней мере, вам понадобится транзакция, и, если я не ошибаюсь, вы можете получить фактический используемый идентификатор только после его вставки, по крайней мере, это обычный способ обработки - см. http : //dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

21
ответ дан 7 November 2019 в 09:04
поделиться

Если это используется вместе для ВСТАВКИ новой записи, вы можете использовать что-то вроде этого.

(Вы указали в своих комментариях, что идентификатор увеличивается автоматически, а для другой таблицы требуется следующий ID + 1)

INSERT INTO TABLE2 (id, field1, field2, field3, etc) 
VALUES(
   SELECT (MAX(id) + 1), field1, field2, field3, etc FROM TABLE1
   WHERE condition_here_if_needed
)

Это псевдокод, но вы поняли идею

0
ответ дан 7 November 2019 в 09:04
поделиться

Один из способов сделать это - установить автоматическое приращение индекса. Затем ваш оператор SQL просто указывает NULL, а затем синтаксический анализатор SQL сделает все остальное за вас.

INSERT INTO foo VALUES (null);
0
ответ дан 7 November 2019 в 09:04
поделиться

Если вы хотите выбрать первый пробел, используйте следующее:

SELECT  @r
FROM    (
        SELECT  @r := MIN(id) - 1
        FROM    t_source2
        ) vars,
        t_source2
WHERE   (@r := @r + 1) <> id
ORDER BY
        id
LIMIT   1;

Существует синтаксическая версия ANSI тот же запрос:

SELECT  id
FROM    mytable mo
WHERE   (
        SELECT  id + 1
        FROM    mytable mi
        WHERE   mi.id < mo.id
        ORDER BY
                mi.id DESC
        LIMIT 1
        ) <> id
ORDER BY
        id,
LIMIT   1

однако он будет медленным из-за ошибки оптимизатора в MySQL .

3
ответ дан 7 November 2019 в 09:04
поделиться

Насколько я понимаю, если есть id: 1,2,4,5, он должен вернуть 3.

SELECT t1.id + 1
FROM theTable t1
WHERE NOT EXISTS (
    SELECT * 
    FROM theTable t2
    WHERE t2.id = t1.id + 1
)
LIMIT 1
10
ответ дан 7 November 2019 в 09:04
поделиться

вы сказали:

мой столбец идентификатора - автоинкремент, у меня есть чтобы получить идентификатор и преобразовать его в другая база. так что мне нужно получить следующую идентификатор перед вставкой вызывает преобразованный код также будет вставлен.

то, что вы просите, очень опасно и приведет к состоянию гонки. если ваш код запускается дважды одновременно разными пользователями, они оба получат 6, и их обновления или вставки будут перебирать друг друга.

Я предлагаю вам вместо INSERT в таблицу , получите значение auto_increment, используя LAST_INSERT_ID () , а затем UPDATE строку, чтобы установить любое имеющееся у вас значение, которое зависит от значения auto_increment.

4
ответ дан 7 November 2019 в 09:04
поделиться

Учитывая то, что вы сказали в комментарии:

мой столбец идентификатора автоматически увеличивается, мне нужно получить идентификатор и преобразовать его в другую базу. Поэтому мне нужно получить следующий идентификатор перед вставкой потому что преобразованный код тоже будет вставлен.

Есть способ сделать то, что вы просите, а именно спросить таблицу, какой идентификатор следующей вставленной строки будет перед вы фактически вставляете:

SHOW TABLE STATUS WHERE name = "myTable"

в этом наборе результатов будет поле с именем «Auto_increment», которое сообщает вам следующее значение автоматического увеличения.

12
ответ дан 7 November 2019 в 09:04
поделиться

Обновление 2014-12-05: Я не рекомендую этот подход по причинам, изложенным в (принятом) ответе Саймона, а также в комментарии Диего. Пожалуйста, используйте приведенный ниже запрос на свой страх и риск.

Самый короткий, который я нашел на сайте разработчика mysql:

SELECT Auto_increment FROM information_schema.tables WHERE table_name='the_table_you_want'

имейте в виду, если у вас несколько баз данных с одинаковыми таблицами, вы также должны указать имя базы данных, например:

SELECT Auto_increment FROM information_schema.tables WHERE table_name='the_table_you_want' AND table_schema='the_database_you_want';
85
ответ дан 7 November 2019 в 09:04
поделиться

Если вы действительно хотите вычислить ключ следующей вставки перед вставкой строки (что, на мой взгляд, не очень хорошая идея), я бы посоветовал вам использовать максимум, используемый в настоящее время id плюс один:

SELECT MAX(id) + 1 FROM table

Но я бы посоветовал вам позволить MySQL создать сам id (используя столбец с автоинкрементом) и использовать LAST_INSERT_ID () для его получения из СУБД. Для этого используйте транзакцию, в которой вы выполняете вставку, а затем запрашиваете идентификатор, например:

INSERT INTO table (col1) VALUES ("Text");
SELECT LAST_INSERT_ID();

Теперь набор возвращаемых данных содержит только один столбец, содержащий идентификатор вновь созданной строки.

1
ответ дан 7 November 2019 в 09:04
поделиться
Другие вопросы по тегам:

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