powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Уникальный индекс с пустым значением
8 сообщений из 8, страница 1 из 1
Уникальный индекс с пустым значением
    #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
Уникальный индекс с пустым значением
    #39784327
logist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vassil,

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

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

Кстати Data=aka не имеет смысла если aka в самом индексе
...
Рейтинг: 0 / 0
Уникальный индекс с пустым значением
    #39784542
vassil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
logist,
триплет (tradingNetwork, goodsGroup, aka) чтобы был уникальным.
...
Рейтинг: 0 / 0
Уникальный индекс с пустым значением
    #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
Уникальный индекс с пустым значением
    #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
Уникальный индекс с пустым значением
    #39784731
vassil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хорошо, спасибо за информацию.
...
Рейтинг: 0 / 0
Уникальный индекс с пустым значением
    #39784781
ser_shu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vassil, пустые значения не контролируются на уникальность на уровне %Save().
можно поставить Type=key, но там свои заморочки, пустое превращается в -1000000000(0), строки пишутся "как есть".
обычно пустые значения не допускаются там, где требуется уникальность, так что никто и не влетает.
...
Рейтинг: 0 / 0
Уникальный индекс с пустым значением
    #39785146
ser_shu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
logistvassil,
...
Кстати Data=aka не имеет смысла если aka в самом индексе
смысл небольшой есть, так как в индексе значение aka преобразованное (тип string).
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Уникальный индекс с пустым значением
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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