Гость
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Уникальный индекс с пустым значением / 8 сообщений из 8, страница 1 из 1
10.03.2019, 15:09
    #39784270
vassil
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный индекс с пустым значением
Есть уникальный индекс из нескольких свойств IndexAka.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Index IndexAka On (tradingNetwork, goodsGroup, aka) [ Data = aka, Unique ];

Property aka As %String(MAXLEN = 300,TRUNCATE=1) ;

Index goodsGroupIndex On goodsGroup;

Relationship bonusOperationGoods As doc.BonusOperationGoods(JSONIGNORE = 1) [ Cardinality = many, Inverse = goodsName ];

Property tradingNetwork As ent.TradingNetwork;

Relationship goodsGroup As ent.GoodsGroup [ Cardinality = one, Inverse = goodsName ];

Property goodsGroupList As list Of %String(MAXLEN = 300);

/// Артикул товара
Property marking as %String;



Если например, группа не указана (goodsGroup), то выражение

Код: sql
1.
2.
3.
set groupId = ""
&sql(INSERT OR UPDATE into ent.GoodsName (tradingNetwork,aka,goodsGroup,goodsGroupList,marking) 
 		values (:accountId,:goodsName,:groupId,:groupList,:marking))


не обновляет уже существующую запись, а создает еще одну такую же с пустой группой. Как сделать, чтобы пустое значение тоже участвовало в уникальности?
...
Рейтинг: 0 / 0
11.03.2019, 05:52
    #39784327
logist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный индекс с пустым значением
vassil,

Я не совсем понял - ты хочешь чтобы aka было уникальным или триплет (tradingNetwork, goodsGroup, aka)?

Как у тебя объявлено - это должно быть одно из 3 уникальное (т.е. триплет уникальный)

Кстати Data=aka не имеет смысла если aka в самом индексе
...
Рейтинг: 0 / 0
11.03.2019, 15:42
    #39784542
vassil
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный индекс с пустым значением
logist,
триплет (tradingNetwork, goodsGroup, aka) чтобы был уникальным.
...
Рейтинг: 0 / 0
11.03.2019, 18:26
    #39784643
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный индекс с пустым значением
vassil,

мне кажется, плохая практика использовать insert or update без явного указания полей естественного ключа.
А ваша ситуация, кажется, из-за этого: INSERT OR UPDATE determines of a record exists by matching UNIQUE KEY field values to the existing data values. If a UNIQUE KEY violation occurs, INSERT OR UPDATE performs an update operation. Note that a UNIQUE KEY field value may not be a value explicitly specified in INSERT OR UPDATE; it may be the result of a column default value or a computed value.
https://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=RSQL_insert

Т.е. она сначала делает insert, а потом, если он не удался, update. Я, честно говоря, думал, что null участвует в уникальности.
...
Рейтинг: 0 / 0
12.03.2019, 04:20
    #39784730
logist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный индекс с пустым значением
vassil,

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
zIndexAkaCheckUnique(id="",pValue...) [ SQLCODE,id,pValue ] public { New %ROWCOUNT,%ROWID,%msg,SQLCODE 
	if ($Get(pValue(1))'="")&&($Get(pValue(2))'="")&&($Get(pValue(3))'="") {
		 ;---&sql(SELECT 1 as _PassFail FROM zTRAK_SSH.UniqueTest WHERE tradingNetwork = :pValue(1) AND goodsGroup = :pValue(2) AND aka = :pValue(3) AND %ID <> :id)
 		 ;--- ** SQL PUBLIC Variables: %ROWCOUNT, %ROWID, %msg, SQLCODE, id, pValue
		do %0Ro
		Quit SQLCODE=100
	} else { quit 1 } }
 q



https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=RSQL_createtable#RSQL_createtable_fconstraints

The UNIQUE data constraint specifies that this field accepts only unique values. Thus, no two records can contain the same value for this field. The SQL empty string ('') is considered to be a data value, so with the UNIQUE data constraint applied, no two records can contain an empty string value for this field. A NULL is not considered to be a data value, so the UNIQUE data constraint does not apply to multiple NULLs. To restrict use of NULL for a field, use the NOT NULL keyword constraint.

Я думаю что простейший способ обойти это ограничение - сделать вычисляемое поле, которое будет принимать не-пустое значение для пустого goodsGroup

Класс:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
Class zTRAK.SSH.UniqueTest Extends %Persistent
{

Index IndexAka On (tradingNetwork, goodsGroupIndexed, aka) [ Data = aka, Unique ];

Property aka As %String(MAXLEN = 300, TRUNCATE = 1);

Index goodsGroupIndex On goodsGroup;

Property tradingNetwork As %Numeric;

Property goodsGroup As %Numeric;

Property goodsGroupIndexed As %Numeric [ SqlComputeCode = {set {*}=+{goodsGroup}}, SqlComputed ];

Property goodsGroupList As list Of %String(MAXLEN = 300);

ClassMethod Run()
{
	do ..%KillExtent()
	set accountId=1,goodsName="g1",groupId="",groupList=""
	&SQL(INSERT OR UPDATE INTO zTRAK_SSH.UniqueTest (tradingNetwork,aka,goodsGroup,goodsGroupList)
		VALUES (:accountId,:goodsName,:groupId,:groupList))
	write "run 1: ",SQLCODE,!
	set accountId=1,goodsName="g1",groupId="",groupList=""
	&SQL(INSERT OR UPDATE INTO zTRAK_SSH.UniqueTest (tradingNetwork,aka,goodsGroup,goodsGroupList)
		VALUES (:accountId,:goodsName,:groupId,:groupList))
	write "run 2: ",SQLCODE,!
	quit $$$OK
}


}




Пример:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
DEV>w ##class(zTRAK.SSH.UniqueTest).Run()                         
run 1: 0
run 2: 0
1
DEV>zw ^zTRAK.SSH.UniqueTestI                                     
^zTRAK.SSH.UniqueTestI("IndexAka",1,0," G1",1)=$lb("","g1")
^zTRAK.SSH.UniqueTestI("goodsGroupIndex",-100000000000000,1)=""

DEV>zw ^zTRAK.SSH.UniqueTestD
^zTRAK.SSH.UniqueTestD=1
^zTRAK.SSH.UniqueTestD(1)=$lb("","g1",1,"","",,0)
...
Рейтинг: 0 / 0
12.03.2019, 05:14
    #39784731
vassil
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный индекс с пустым значением
Хорошо, спасибо за информацию.
...
Рейтинг: 0 / 0
12.03.2019, 11:19
    #39784781
ser_shu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный индекс с пустым значением
vassil, пустые значения не контролируются на уникальность на уровне %Save().
можно поставить Type=key, но там свои заморочки, пустое превращается в -1000000000(0), строки пишутся "как есть".
обычно пустые значения не допускаются там, где требуется уникальность, так что никто и не влетает.
...
Рейтинг: 0 / 0
13.03.2019, 02:49
    #39785146
ser_shu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный индекс с пустым значением
logistvassil,
...
Кстати Data=aka не имеет смысла если aka в самом индексе
смысл небольшой есть, так как в индексе значение aka преобразованное (тип string).
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Уникальный индекс с пустым значением / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]