Заполните пустой идентификатор MySQL - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть таблица, подобная следующей:

+----+-------+
| id | name  |
+----+-------+
|  1 | John  |
|  3 | Bob   |
|  4 | Alice |
+----+-------+

Если я добавлю новую строку, как мне заполнить пустой идентификатор (например, идентификатор 2, затем 4, 5, ..., n) автоматически с помощью функции / триггера?

Ответы [ 3 ]

0 голосов
/ 24 декабря 2018

Попробуйте это решение:

CREATE TABLE temp1 (
        id int,
        name varchar(100)
    );

    select l.id + 1 as id,l.[name]
    from temp1 as l
      left join temp1 as r on l.id + 1 = r.id
    union all 
    Select * from temp1
    order by id 
0 голосов
/ 24 декабря 2018

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

create table #temp(id int, name varchar(20))
insert into #temp values (1 , 'John'),(3, 'Bob'),(4, 'Alice')

create table #sequence (id int not null primary key);

insert into #sequence(id)
    select 1
    union all select 2
    union all select 3
    union all select 4
    union all select 6
    union all select 7
    union all select 8
    union all select 9
    union all select 10
    union all select 15
    union all select 16
    union all select 17
    union all select 18
    union all select 19
    union all select 20

    declare @Id int

    select @Id = min (start) from(
    select l.id + 1 as start from #sequence as l
    left outer join #temp as r on l.id + 1 = r.id
    where r.id is null
    )a;

select @Id

Выход - 2, после чего вы можете использовать эту переменную влюбая операция SQL.

0 голосов
/ 24 декабря 2018

Предполагая, вы используете SQL Server (вы отметили здесь и SQL Server, и MySQL) Похоже, вы полагаетесь на свойство IDENTITY для надежного предоставления последовательных чисел;это не так.Согласно документации, CREATE TABLE (Transact-SQL) IDENTITY (Свойство) :

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

  • Последовательные значения в транзакции - транзакция, вставляющая несколько строк, не гарантирует получение последовательных значений для строк
    , так как другие параллельные вставки могут происходить настол.Если значения
    должны быть последовательными, то транзакция должна использовать исключительную блокировку
    для таблицы или уровень изоляции SERIALIZABLE.
  • Последовательные значения после перезапуска сервера или других ошибок - SQL Server может кэшировать значения идентификаторовпо соображениям производительности и некоторые
    назначенных значений могут быть потеряны при сбое базы данных или при перезапуске
    сервера.Это может привести к пробелам в значении идентичности при
    вставке.Если пропуски неприемлемы, приложение должно использовать
    свой собственный механизм для генерации значений ключей.Использование генератора последовательностей
    с опцией NOCACHE может ограничить разрывы для транзакций, которые
    никогда не совершаются.

Если вам нужно гарантировать, что числа последовательны ввремя выполнения , вы можете ROW_NUMBER():

SELECT ROW_NUMBER () OVER (ORDER BY ID) AS RN
       [Name]
FROM YourTable;

Для идентификаторов вряд ли найдется хорошая причина, по которой вы хотите, чтобы они были непрерывными.Наличие «пробелов» в ваших значениях идентификаторов на самом деле не имеет значения, поскольку ограничения и индексы (внешний ключ) не заботятся о наличии пробелов или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...