Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: UNIQUE в MS SQL и в ORACLE  [new]
www.fun4me.narod.ru
Member

Откуда: Moscow
Сообщений: 2406
vadiminfo
Там просто данных нет и потому операции сравнения бессмысленны. Можно тока проверить что значения нет (IS NULL).


Ну вот есть один, допустим, у меня столбец. И в нём есть 819 строк. В каждой из строк нет значения. И в чём тут уникальность?
10 июн 05, 18:53    [1614890]     Ответить | Цитировать Сообщить модератору
 Re: UNIQUE в MS SQL и в ORACLE  [new]
vybegallo
Guest
Gold
Хотя да, если об этом написано в документации, то это у MS фича...


И не только у MS. Все идут не в ногу, один Оракл идет в ногу...
10 июн 05, 19:36    [1614979]     Ответить | Цитировать Сообщить модератору
 Re: UNIQUE в MS SQL и в ORACLE  [new]
vybegallo
Guest
gardenman
может проголосуем? ))
Sybase,MS SQL,DB2 - на одной стороне
Oracle,PostgreSQL,MySQL - на другой

Как интересно у INFORMIX и как у INTERBASE?


Informix на стороне стандарта - не более одного NULL значения. А IQ щас проверим... хм, IQ позволяет больше одного NULL.
10 июн 05, 20:00    [1615009]     Ответить | Цитировать Сообщить модератору
 Re: UNIQUE в MS SQL и в ORACLE  [new]
Андрей Леонидович
Guest
vadiminfo все хорошо объяснил.
Если null интерпретировать как "значение пока не известно", то Oracle работает "правильно". Но поскольку такие значения в Oracle, похоже, все еще не индексируются (возможно именно поэтому он и допускает много null), он не может быстро найти соответствующие записи.
Если null интерпретировать как "значение равно пустоте", то MS SQL работает "правильно". Но тогда трудности с примером vadiminfo (1611329).
Попробуйте привести практический пример, когда null следует интерпретировать как "значение равно пустоте" при объявлении для атрибута unique.
А вот примеров с "значение пока не известно" (и, тем более, "не определено" - в случае "разреженных таблиц") - сколько угодно. Так что Oracle практически "правильнее", но отсутствие индекса по пустым значениям - жуткая убогость (если это все еще так)...
10 июн 05, 21:01    [1615116]     Ответить | Цитировать Сообщить модератору
 Re: UNIQUE в MS SQL и в ORACLE  [new]
vadiminfo
Member

Откуда: Обнинск
Сообщений: 4802
www.fun4me.narod.ru

Ну вот есть один, допустим, у меня столбец. И в нём есть 819 строк. В каждой из строк нет значения. И в чём тут уникальность?

В том, что нет дубликатов, например. Нет значений, потому они и не могут дублироваться.
Вопрос в том считать ли NULL значением. Но ведь это не значение? Это отсутствие значения. Причем не известна причина отсутствия. Могут быть, например причины: свойство не определено для данной записи, не известно на момент ввода, отсутствует на момент ввода. Следовательно, ничего нельзя сказать дублирует оно, одно из имеющихся или нет.
Просто ограничение целостности уникальность - не есть выделенный ключ (первичный или альтернативный). В обоих пустые значения должны быть запрещены. Или должно разрешаться только одно. Но тогда пустое значение трактуется как значение. Но это плохо согласуется с тем, что на самом деле реальное значение либо не известно, либо отсутствует. Поэтому, мне кажется, что уникальность значений должна распространяться именно на значения. А для решения вопросов с отсутствием значений должны быть другие средства. Например, их запрет или разрешение.
10 июн 05, 21:18    [1615133]     Ответить | Цитировать Сообщить модератору
 Re: UNIQUE в MS SQL и в ORACLE  [new]
ASCRUS
Member

Откуда: МО Электросталь
Сообщений: 5994
В ASA сделано просто:
1. UNIQUE CONSTRAINT можно создавать только на NOT NULL поля
2. UNIQUE INDEX можно создавать на NULL поля (поведение как в Оракле)
3. Оптимизатор учитывает индексы с NULL полями
4. В CHECK CONSTRAINT выражение (Поле IN (1, 2, 3)) при поле со значением NULL вернет true

4 пункт самый веселый и самый злобный в отношении стандарта ANSI SQL. Но ... при использовании оказывается самый удобный. Действительно, если у меня NULL поле и я пишу на него проверку, то это уже означает, что к ней изначально подразумевается, что помимо перечисленных условий поле может содержать NULL. Соотвествующе вместо того, чтобы дописывать "OR Поле IS NULL" и увеличивать скрипт и работу сервера при проверках, здесь ввели сей возмутительный факт (Значение = NULL) = TRUE

P.S. Можно возмущаться сколько угодно, но лично мне поддержка NULL в UNIQUE INDEX и нарушение булевых операций с NULL в CHECK очень даже нравится, потому как помимо понятия "Правильно" есть еще понятия "Обоснованно" и "Удобно". Тем более, что если посмотреть на все существующие РСУБД и их "отклонения", сложно уже говорить о каких то стандартах, хотя каждый производитель и уверяет, что его РСУБД уж точно в полном обьеме поддерживает стандарты ANSI SQL таких то версий.
10 июн 05, 23:16    [1615230]     Ответить | Цитировать Сообщить модератору
 Re: UNIQUE в MS SQL и в ORACLE  [new]
c127
Guest
2 azhukov

>и следовательно в уникальном столбце может быть сколько угодно пустых значений, если только это не первичный ключ.

Именно так и написано в стандарте, если я не ошибаюсь, но ссылки у меня нет.
11 июн 05, 03:05    [1615333]     Ответить | Цитировать Сообщить модератору
 Re: UNIQUE в MS SQL и в ORACLE  [new]
gardenman
Member

Откуда: С-Петербург
Сообщений: 2347
ASCRUS

Sybase IQ как и полагается аналитическому серваку естественно сверху


Sybase IQ именно как "аналитический" сервак, действительно должен был бы быть сверху во всех позициях, но к сожалению, судя по тестам на производительность TPC-H ему больше наравится снизу...
15 июн 05, 11:42    [1621039]     Ответить | Цитировать Сообщить модератору
 Re: UNIQUE в MS SQL и в ORACLE  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2400
Блог
Весело у вас. )
15 июн 05, 12:15    [1621164]     Ответить | Цитировать Сообщить модератору
 Re: UNIQUE в MS SQL и в ORACLE  [new]
alexey_tm
Member

Откуда: Томск
Сообщений: 173
Вот слушаю вас и радуюсь, ну что вы пристали к unique? В Oracle действительно может быть несколько null в поле с наложенным ограничением уникальности, но если по данному полю будет обявлено огранчение целосности первичный ключь, то сразу включится not null. В стандарте явно ничего по поводу уникальных полей не прописано (в противном случае во всех СУБД это было бы реализованно одинаково), и если мне не изменяет память Кодд сам толком не мог обяснить, что с этими null делать. Каждая компания разрабатывающая СУБД в меру своих представлений и потребностей клиентов, реализует то, что не прописано в стандартах.
15 июн 05, 13:48    [1621661]     Ответить | Цитировать Сообщить модератору
 Re: UNIQUE в MS SQL и в ORACLE  [new]
hvlad
Guest
Посмотрим же наконец в стандарт. У меня есть только SQL 2002

SQL 2002
11.7 <unique constraint definition>
...
<unique constraint definition> ::=
<unique specification> <left paren> <unique column list> <right paren>
| UNIQUE ( VALUE )
<unique specification> ::=
UNIQUE
| PRIMARY KEY
<unique column list> ::= <column name list>
...
Syntax Rules
...
3) If <unique column list> UCL is specified, then
...
c) Case:
i) If the <unique specification> specifies PRIMARY KEY, then let SC be the <search
condition>:

UNIQUE ( SELECT UCL FROM TN )
AND
( UCL ) IS NOT NULL

ii) Otherwise, let SC be the <search condition>:

UNIQUE ( SELECT UCL FROM TN )

4) If UNIQUE (VALUE) is specified, then let SC be the <search condition>:

UNIQUE ( SELECT TN.* FROM TN )
...
General Rules
...
2) The unique constraint is not satisfied if and only if
EXISTS ( SELECT * FROM TN WHERE NOT ( SC ) )
is True


А что такое UNIQUE ? А вот:
SQL 2002
8.10 <unique predicate>
..
<unique predicate> ::= UNIQUE <table subquery>
...
General Rules
1) Let T be the result of the <table subquery>.
2) If there are no two rows in T such that the value of each column in one row is non-null and is not distinct from the value of the corresponding column in the other row, then the result of the <unique predicate> is True ; otherwise, the result of the <unique predicate> is False


Т.е. значения колонок не должны быть не NULL'ами и не различными, говоря по-русски - значения колонок должны быть или NULL'ами или отличаться, т.е. допускается неограниченное кол-во NULL'ов.

Вопросы ?
15 июн 05, 15:19    [1622132]     Ответить | Цитировать Сообщить модератору
 Re: UNIQUE в MS SQL и в ORACLE  [new]
c127
Guest
alexey_tm
В стандарте явно ничего по поводу уникальных полей не прописано (в противном случае во всех СУБД это было бы реализованно одинаково)


Добро пожаловать в реальный мир.

http://www.cse.iitb.ac.in/dbms/Data/Papers-Other/SQL1999/ansi-iso-9075-2-1999.pdf

разд. 4.17.2 "Table Constraints"

"A unique constraint is satisfied if and only if no two rows in a table have the same non-null values in the unique columns. In addition, if the unique constraint was defined with PRIMARY KEY, then it requires that none of the values in the specified column or columns be a null value."

Выделено мной.

Т.е. если значения null, то может повторяться сколько угодно.
16 июн 05, 05:17    [1623498]     Ответить | Цитировать Сообщить модератору
 Re: UNIQUE в MS SQL и в ORACLE  [new]
c127
Guest
2 hvlad

Виноват, не заметил. Авторство не оспариваю.
16 июн 05, 05:23    [1623502]     Ответить | Цитировать Сообщить модератору
 Re: UNIQUE в MS SQL и в ORACLE  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67377
Блог
c127
Т.е. если значения null, то может повторяться сколько угодно.

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

Практически - я бы сказал, требование уникальности null-ов оправдано, если применяется совместно со связкой по null-у - в смысле, если запрос вида

select * from a, b where a.id = b.id and a.id is null

способен вернуть непустой результат. Но это вроде бы уже явно нарушает стандарт и - по моему опыту - ведет к очень противным ошибкам.
16 июн 05, 06:02    [1623519]     Ответить | Цитировать Сообщить модератору
 Re: UNIQUE в MS SQL и в ORACLE  [new]
hvlad
Guest
c127
2 hvlad

Виноват, не заметил. Авторство не оспариваю.
Я тоже не оспариваю - оно у соотв. комитета ANSI
16 июн 05, 14:43    [1625331]     Ответить | Цитировать Сообщить модератору
 Re: UNIQUE в MS SQL и в ORACLE  [new]
ЛП
Guest
2 softwarer
c127
Т.е. если значения null, то может повторяться сколько угодно.

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

По-моему в приведенной c127 цитате все совершенно однозначно.
Нет двух строк с одинаковыми ненулловыми значениями (в уникальных столбцах) -> уник констрейнт сатисфаед. И наоборот. По определению.
If and only if. Тогда и только тогда. Необходимо и достаточно.

Реализовано решение, которое соответствует стандарту

Не соответствует.
Нет двух строк с одинаковыми ненулловыми значениями, но тем не менее (по прихоти разработчика) уник констрейнт получился не сатисфаед.
Не выполняется один из двух if-ов в буквосочетании "if and only if"

и накладывает дополнительное, не предусмотренное стандартом ограничение.

И из всего этого получается некий (свой собственный) констрейнт. Но этот свой собственный констрейнт - это не Unique Constraint. По крайнем мере, не Unique Constraint в ANSI-шном понимании этого слова.
16 июн 05, 15:15    [1625518]     Ответить | Цитировать Сообщить модератору
 Re: UNIQUE в MS SQL и в ORACLE  [new]
c127
Guest
hvlad
c127
2 hvlad

Виноват, не заметил. Авторство не оспариваю.
Я тоже не оспариваю - оно у соотв. комитета ANSI


Я не оспариваю авторства решения задачи. Приведя цитату из стандарта, Вы первым решили обсуждаемую задачу.
17 июн 05, 01:08    [1627160]     Ответить | Цитировать Сообщить модератору
 Re: UNIQUE в MS SQL и в ORACLE  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67377
Блог
ЛП
И из всего этого получается некий (свой собственный) констрейнт. Но этот свой собственный констрейнт - это не Unique Constraint. По крайнем мере, не Unique Constraint в ANSI-шном понимании этого слова.

Согласен.
17 июн 05, 13:01    [1628620]     Ответить | Цитировать Сообщить модератору
 Re: UNIQUE в MS SQL и в ORACLE  [new]
Dreamy_Helga
Member

Откуда: от верблюда
Сообщений: 70
hvlad
Посмотрим же наконец в стандарт. У меня есть только SQL 2002
Вопросы ?


Какие вопросы? Микрософт - козлы.
Извините, что поздно присоединилась. Искала ответ на свое недоумение, нашла и ... не могу прийти в себя. Вот моя маленькая история.
Сменила работу. Как следствие, сменила oracle на ms sql server. Перед проектированием бд прочилата(!!!! решила в кои-то веки документацию почитать :-#) ОФИЦИАЛЬНУЮ документацию к учебному курсу "Проектирование и реализация баз данных MS SQL Sqerver 2000"

Цитирую:

Ограничения UNIQUE разрешается определить для столбцов, допускающих пустые значения (NULL)...
... SQL Server 2000 проверяет имеющиеся в столбцах данные, чтобы гарантировать уникальность ВСЕХ значений, КРОМЕ пустых.

И вот бд спроектирована, тестирую...

Добро пожаловать в реальный мир! Микрософт - ... нет слов, одни нецензурные выражения.
15 ноя 05, 12:25    [2069582]     Ответить | Цитировать Сообщить модератору
 Re: UNIQUE в MS SQL и в ORACLE  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
Dreamy_Helga
hvlad
Посмотрим же наконец в стандарт. У меня есть только SQL 2002
Вопросы ?


Какие вопросы? Микрософт - козлы.
Извините, что поздно присоединилась. Искала ответ на свое недоумение, нашла и ... не могу прийти в себя. Вот моя маленькая история.
Сменила работу./.

Хотите угадаю Вашу реакцию в первый рабочий день на новом месте?
"Прихожу я на работу - сидят одни козлы"

Девушка, ну что же Вы первое своё сообщение начинаете с ругани?
15 ноя 05, 15:05    [2070635]     Ответить | Цитировать Сообщить модератору
 Re: UNIQUE в MS SQL и в ORACLE  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Dreamy_Helga
ОФИЦИАЛЬНУЮ документацию к учебному курсу "Проектирование и реализация баз данных MS SQL Sqerver 2000"


А надо все-таки было BOL читать:

Also, unlike PRIMARY KEY constraints, UNIQUE constraints allow the value NULL. However, as with any value participating in a UNIQUE constraint, only one NULL value is allowed per column.
16 ноя 05, 10:07    [2072972]     Ответить | Цитировать Сообщить модератору
 Re: UNIQUE в MS SQL и в ORACLE  [new]
Dreamy_Helga
Member

Откуда: от верблюда
Сообщений: 70
pkarklin
Dreamy_Helga
ОФИЦИАЛЬНУЮ документацию к учебному курсу "Проектирование и реализация баз данных MS SQL Sqerver 2000"


А надо все-таки было BOL читать:

Also, unlike PRIMARY KEY constraints, UNIQUE constraints allow the value NULL. However, as with any value participating in a UNIQUE constraint, only one NULL value is allowed per column.


ок, так и сделаю (и сразу проверять - на всяк случай)
28 ноя 05, 17:10    [2117375]     Ответить | Цитировать Сообщить модератору
 Re: UNIQUE в MS SQL и в ORACLE  [new]
segun
Member

Откуда: Москва
Сообщений: 504
Dreamy_Helga
pkarklin
Dreamy_Helga
ОФИЦИАЛЬНУЮ документацию к учебному курсу "Проектирование и реализация баз данных MS SQL Sqerver 2000"


А надо все-таки было BOL читать:

Also, unlike PRIMARY KEY constraints, UNIQUE constraints allow the value NULL. However, as with any value participating in a UNIQUE constraint, only one NULL value is allowed per column.


ок, так и сделаю (и сразу проверять - на всяк случай)
все проверять нужно в любом случае, и неважно какой продукт. А то что MS SQL отличается от Oracle и наоборот - так это давно известный факт. Удивительно что вы думали работать с MSSQL как с Oracle.
28 ноя 05, 17:56    [2117645]     Ответить | Цитировать Сообщить модератору
 Re: UNIQUE в MS SQL и в ORACLE  [new]
c127
Guest
segun
все проверять нужно в любом случае, и неважно какой продукт. А то что MS SQL отличается от Oracle и наоборот - так это давно известный факт. Удивительно что вы думали работать с MSSQL как с Oracle.


В том то и дело, что в не-мелкософтовских продуктах ВСЕ проверять как раз не нужно, оно работает как написано в документации. Это у серьезных производителей, не обязательно больших и не обязательно платных. Поработав с мелкософтом и привыкнув к необходимости все проверять, переходишь потом на другой продукт и не устаешь удивляться, когда все пишешь по документации и оно сразу работает.
29 ноя 05, 03:29    [2118593]     Ответить | Цитировать Сообщить модератору
 Re: UNIQUE в MS SQL и в ORACLE  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
c127
В том то и дело, что в не-мелкософтовских продуктах ВСЕ проверять как раз не нужно, оно работает как написано в документации.


Ой, я Вас умоляю... Metalink по объемам ни чуть не меньше MSKB. И то что безбажных продуктов не бывает сие есть факт
29 ноя 05, 09:25    [2118828]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Сравнение СУБД Ответить