Значение поля должно быть уникальным, если это не является ПУСТЫМ

Вы используете addListenerForSingleValueEvent(), который будет прослушивать только одно значение, а затем останавливаться. Вам нужно использовать addValueEventListener().

10
задан kristian 4 December 2009 в 03:54
поделиться

7 ответов

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

Ограничение:

   field is null or dbo.fn_count_maximum_of_field(field) < 2

РЕДАКТИРОВАНИЕ я не могу помнить прямо сейчас - и не могу проверить его или - сделана ли ограничительная проверка перед вставлением/обновлением или после. Я думаю после со вставлением/обновлением откатываться при отказе. Если оказывается, что я неправ, 2 выше должны быть 1.

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

   declare @retVal int

   select @retVal = max(occurrences)
   from ( 
        select field, count(*) as occurrences
        from dbo.tbl
        where field = @field
        group by field
   ) tmp

Это должно быть довольно быстро если Ваш столбец как (групповой) индекс на нем.

4
ответ дан 3 December 2019 в 21:23
поделиться

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

create view dbo.UniqueAssetTag with schemabinding
as
select asset_tag
from dbo.equipment
where asset_tag is not null

GO

create unique clustered index ix_UniqueAssetTag
on UniqueAssetTag(asset_tag)

GO

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

Примечание: При использовании mssql 2000, необходимо будет "УСТАНОВИТЬ ARITHABORT НА" прямо, прежде чем любой вставит, обновит или удалит, выполняется на таблице. Вполне уверенный это не требуется на mssql 2005 и.

6
ответ дан 3 December 2019 в 21:23
поделиться

В Oracle уникальный ключ разрешит несколько ПУСТЫХ УКАЗАТЕЛЕЙ.

В SQL Server 2005 хороший подход должен сделать Ваши вставки посредством представления и отключить прямые вставки в таблицу.

Вот некоторый пример кода.

2
ответ дан 3 December 2019 в 21:23
поделиться

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

Существует дискуссия о просто этом виде проблемы здесь: http://blog.sqlauthority.com/2008/09/07/sql-server-explanation-about-usage-of-unique-index-and-unique-constraint/

К вашему сведению - SQL Server 2008 представляет фильтрованные индексы, которые позволили бы Вам приближаться к этому немного по-другому.

2
ответ дан 3 December 2019 в 21:23
поделиться

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

Однако Вам только разрешают один ПУСТОЙ УКАЗАТЕЛЬ в ограничении на уникальность данных / индекс. Так, необходимо будет использовать триггер для обнаружения дубликатов.

Требовалось от MS проигнорировать, АННУЛИРУЕТ, но SQL, 2008 фильтровал индексы (как упомянуто, в то время как я ввожу это),

0
ответ дан 3 December 2019 в 21:23
поделиться

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

0
ответ дан 3 December 2019 в 21:23
поделиться

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

ALTER TABLE MYTABLE 
ADD COL2 AS (CASE WHEN COL1 IS NULL THEN CAST(ID AS NVARCHAR(255)) ELSE COL1 END)

CREATE UNIQUE INDEX UQ_COL2 ON MYTABLE (COL2)   

Предполагается, что ID - это PK вашей таблицы, а COL1 - это "уникальный или нулевой "столбец.

Вычисляемый столбец (COL2) будет использовать значение PK, если ваш "уникальный" столбец равен нулю.

Все еще существует возможность конфликтов между столбцом ID и COL1 в следующем примере:

ID     COL1    COL2
1     [NULL]    1
2        1      1

Чтобы обойти для этого я обычно создаю другой вычисляемый столбец, в котором хранится, происходит ли значение в COL2 из столбца ID или столбца COL1:

 ALTER TABLE MYTABLE 
 ADD COL3 AS (CASE WHEN COL1 IS NULL THEN 1 ELSE 0 END)

Индекс должен быть изменен на:

CREATE UNIQUE INDEX UQ_COL2 ON MYTABLE (COL2, COL3)   

Теперь индекс находится в обоих вычисляемых столбцах COL2 и COL3, так что там не проблема:

ID     COL1    COL2   COL3
1     [NULL]    1       1
2        1      1       0
3
ответ дан 3 December 2019 в 21:23
поделиться
Другие вопросы по тегам:

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