«Слот» в зависимости от идентификатора пользователя и т. Д. Sql - PullRequest
1 голос
/ 07 декабря 2011

У меня есть такая таблица

Идентификационный номер пользовательского слота

Я хочу, чтобы слот зависел от идентификатора пользователя.

Если у меня 4 столбца

id: 1
user: 1
item: 1
slot: 1

id: 2
user: 1
item: 1
slot: 2

id: 3
user: 1
item: 2
slot: 3

id: 4
user: 1
item: 2
slot: 4

Если я добавлю новый предмет, ему автоматически будет предоставлен слот 5. Но если я сначала, скажем, удалил (слот 2 или перенес его в другой слот, новый предмет должен получить слот № 2. Возможно ли с SQL?

Слот - это, по сути, позиция, в которой находится строка "item".

Инвентарь будет выглядеть так:

1 2 3 4 5
6 7 8 9 10
11 12 13 14
15 16 17 18
19 20

Где цифры 1-20 являются слотами. Если, скажем, 4 слота выше заняты предметами, следующие предметы должны быть назначены 5. Но если я переместу предмет (например, слот 2) в слот 20, следующий предмет должен быть помещен на номер 2, так как не принято сейчас. Если бы оба 3-4 были удалены, а затем был добавлен элемент, он был бы помещен в 3.

Ответы [ 2 ]

1 голос
/ 08 декабря 2011

Вы можете использовать триггер вставки для обновления слота, или вы можете самостоятельно определить первый доступный слот при вставке.

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

SELECT min(rnumber)
from (SELECT slot, row_number() OVER (order by slot) as rnumber from <table_name> where slot is not null) as t
where slot <> rnumber

Это дает наименьший свободный слот.Если все слоты заняты, возвращаемое значение равно нулю.Вы должны получить следующий слот с макс (слот) +1.Вы можете использовать isnull(min(rnumber), (select max(slot)+1 from <table_name>) вместо min (номер), чтобы окончательный запрос выглядел следующим образом:

SELECT isnull(min(rnumber), (select max(slot) + 1 from <table_name>))
from (SELECT slot, row_number() OVER (order by slot) as rnumber from <table_name> where slot is not null) as t
where slot <> rnumber
1 голос
/ 07 декабря 2011

Опция 1

Вам необходимо создать триггер в таблице для вставки.

Вот пример:

create trigger forinsertrig1 
on salesdetail 
for insert 
as 
if (select count(*) 
    from titles, inserted 
    where titles.title_id = inserted.title_id) !=
    @@rowcount 
/* Cancel the insert and print a message.*/
  begin
    rollback transaction 
    print "No, the title_id does not exist in
    titles." 
  end  
/* Otherwise, allow it. */
else
  print "Added! All title_id’s exist in titles."

Но в триггере вы обновите слот, который не имеет никакого значения (последнего вставленного), в качестве значения первого пропущенного идентификатора.

Чтобы обнаружить первый пропущенный идентификатор, выМожно выполнить следующие шаги:

  1. выбрать min (id) из таблицы
  2. Сделать цикл, увеличивая id и выбирая строку из таблицы.Первый, у которого нет строки, это ваш пропущенный слот

Опция 2

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

...