получить список удаленных первичных ключей из первичного ключа автоматического увеличения

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

Мне нужно получить все первичные ключи, которые были удалены. нравится

1 xcgh fct

2 xxml fcy

5 ccvb fcc

6 tylu cvn

9 vvbh cvv

Результат, который я должен получить,

3

4

7

8

в настоящее время я подсчитываю все записи, а затем вставляю (1 для подсчета) в другую таблицу, а затем выбираю идентификатор из этой таблицы, который не существует в таблице записей. Но этот метод очень неэффективен. Есть ли прямой запрос, который я могу использовать? пожалуйста, укажите для mysql.


person Ratna    schedule 25.10.2013    source источник
comment
почему ты хочешь сделать это? В общем случае лучше просто оставить пробелы в последовательности автоинкремента.   -  person Ike Walker    schedule 25.10.2013
comment
Это SQL Server или MySQL? Пожалуйста, не отмечайте неоднозначно   -  person Alma Do    schedule 25.10.2013
comment
Я хочу сделать это, потому что мой клиент не понимает первичный ключ, и он говорит, что если мой общий продукт меньше 1000, почему productno больше этого. раздел отчета находится в asp, и я не могу это изменить. А это майскл.   -  person Ratna    schedule 25.10.2013
comment
Поэтому объясните ПК своему клиенту. НЕ возитесь с AUTO_INCREMENTing ключами!   -  person Strawberry    schedule 25.10.2013
comment
Автоинкременты не откатываются, поэтому, если транзакция откатывается по какой-либо причине, в серии будет разрыв. Если документ нуждается в серийной нумерации, автоинкремент — плохой выбор.   -  person Damir Sudarevic    schedule 25.10.2013
comment
Часть решения, скорее всего, будет использовать ранг, как показано в этом примере скрипта.   -  person xQbert    schedule 25.10.2013


Ответы (2)



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

DELIMITER $$
CREATE PROCEDURE InsertRand(IN NumRows INT)
BEGIN
    DECLARE i INT;
    SET i = 1;
    START TRANSACTION;
    WHILE i <= NumRows DO
        INSERT INTO rand VALUES (i);
        SET i = i + 1;
    END WHILE;
    COMMIT;
END$$
DELIMITER ;

CALL InsertRand(5);

Затем вы просто делаете запрос

SELECT id AS deleted_id FROM temporary_table
WHERE id NOT IN
    (SELECT id FROM main_table)

Обратите внимание, что это должно быть похоже на ежедневное действие или что-то в этом роде, потому что это очень неэффективно с памятью.

person wIRELESS    schedule 25.10.2013