Удалите элемент (строку) из таблицы, но сохраните неиспользованный идентификационный номер для будущей вставки - PullRequest
0 голосов
/ 29 мая 2020

У меня есть база данных с таблицей «инвентарь», которая содержит товары из магазина. Каждый продукт идентифицируется с помощью номера ID , установленного в столбце «ID» таблицы. Я хочу иметь возможность удалить продукт из таблицы, но сохранить идентификационный номер удаленного продукта для будущих вставок продукта в базу данных. В качестве демонстрации я вставил 4 элемента и назвал их все «test»

enter image description here

И просто в качестве примера я назвал «удаленный» продукт как « vacio "(пусто в испанском sh), чтобы показать тот, который я удалил.

enter image description here

Теперь, если вы хотите добавить еще один продукт в будущем , номер идентификатора 2 не используется, и я хочу добавить продукт с этим номером идентификатора вместо 4 (в соответствии с данным примером).

Запрос DELETE бесполезен, так как он также стирает номер идентификатора, поэтому его а нет go. Я подумал о проверке первой строки таблицы, содержащей значение «vacio», и использовании запроса UPDATE во всех полях, кроме id, но это не кажется «классным» и не очень эффективным, поскольку ему придется обновлять значения во многих раз. Есть ли хороший способ сделать это?

Ответы [ 2 ]

1 голос
/ 29 мая 2020

У вас может быть новый столбец ESTADO, в котором вы обрабатываете, активна ли запись (1) или неактивна (0). Затем, чтобы получить только «восстановленные» записи, вам просто нужно выполнить фильтрацию по новому столбцу. Таким образом вы также предотвратите изменение названия продукта на «vacio», которое может пригодиться в будущем.

1 голос
/ 29 мая 2020

Я бы не рекомендовал повторно использовать старые идентификаторы. Во-первых, это мешает вам использовать функцию auto_increment, что означает, что вам нужно вручную обрабатывать столбец для каждой вставки: это добавляет сложности и неэффективно. Кроме того, это может вызвать проблемы с целостностью вашей базы данных, если у вас есть другие таблицы, ссылающиеся на идентификатор продукта.

Но если вы действительно хотите go таким образом: я бы использовал go для опции удаления. Если есть внешние ключи, ссылающиеся на столбец, убедитесь, что для них включена опция on delete cascade, чтобы данные правильно очищались из зависимых таблиц при удалении продукта.

Затем вы можете заполнить первый доступный пробел в следующий раз, когда вы создадите новый продукт со следующим запросом:

insert into products(id, categoria, producto)
select min(id) + 1, 'my new category', 'my new product'
from products p
where not exists (select 1 from products p1 where p1.id = p.id + 1)
...