Модераторы: Akina

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> One or Zero to One or Zero 
:(
    Опции темы
Irdis
Дата 26.9.2010, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 21.5.2008

Репутация: нет
Всего: 1



Как реализовать отношение 1..0 к 1..0.
PM MAIL   Вверх
Akina
Дата 26.9.2010, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



Это ты сейчас с кем разговаривал?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Irdis
Дата 26.9.2010, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 21.5.2008

Репутация: нет
Всего: 1



Цитата

Это ты сейчас с кем разговаривал? 

Видимо плохой вопрос?

Есть таблицы A и B. Хочется следующее, допустим в B есть FK a_id (который может быть и NULL). Надо сделать так, что бы любые две записи в таблице B имели различные a_id(ну или NULL).
Т.е. по записи в A я мог достать не более одной записи в B. И по записи в B я мог достать не более одной записи в А.
PM MAIL   Вверх
Gluttton
Дата 26.9.2010, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: нет
Всего: 54



Три таблицы: А (id_a), AB (id_a, id_b), B(id_b).
Два ограничения на внешние ключи: foreign key AB.id_a reference A.id_a, foreign key AB.id_b reference B.id_b.
Два триггера срабатывающих при вставке или обновлении, которые проверяют наличие существующих значений/

Тогда запросы на выборку записей из таблицы B, которые соответстуют записи в таблице А, которе равно Х  будут выглядеть так:
Код

select B.id_b
from B
    inner join AB
    on AB.id_b = B.id_b
        inner join A
        on A.id_a = AB.id_a
            where A.id_a = X;

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


--------------------
Слава Україні!
PM MAIL   Вверх
Zloxa
Дата 27.9.2010, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 10
Всего: 161



Цитата(Irdis @  26.9.2010,  20:49 Найти цитируемый пост)
Есть таблицы A и B. Хочется следующее, допустим в B есть FK a_id (который может быть и NULL). Надо сделать так, что бы любые две записи в таблице B имели различные a_id(ну или NULL).

накинуть ограничение уникальности на b.a_id
Цитата(Gluttton @  26.9.2010,  23:02 Найти цитируемый пост)
Два триггера срабатывающих при вставке или обновлении, которые проверяют наличие существующих значений/

ЧЕРЕЗ ТРИГГЕРЫ КОНТРОЛИРОВАТЬ ОГРАНИЧЕНИЕ ЦЕЛОСТНОСТИ - МОЖНО ТОЛЬКО В ОДНОПОЛЬЗОВАТЕЛЬСКОЙ СРЕДЕ!
Особенно на версионнике.
ты представь как это дожно работать, при конкурентых инсертах/делетах в режиме изоляции read commited.

За блокировочники не поручусь, там - свои ньюансы. Я их на вскидку не могу смоделировать, очень уж давно имел с ними дела.

Добавлено через 11 минут и 39 секунд
Цитата(Zloxa @  27.9.2010,  10:12 Найти цитируемый пост)
накинуть ограничение уникальности на b.a_id

блин, проверил на MS SQL 2000, он nullы счиатает как заначения и проверяет по ним уникальность  smile 

господа, прошу помочь мне сделать правильное заключение, какое из утверждений истинно:
1) Особенностью оракла является то, что ограничение уникальности по null не проверяется
1) Особенностью MS является то, что ограничение уникальности по null проверяется


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Zloxa
Дата 27.9.2010, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 10
Всего: 161



Цитата(Zloxa @  27.9.2010,  10:12 Найти цитируемый пост)
Особенно на версионнике.

блин, почему я не посмотрел название форума? smile 
от чегото был уверен, что мы в форуме "составление запросов", и платформа не указана.



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Gluttton
Дата 27.9.2010, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: нет
Всего: 54



Цитата(Zloxa @  27.9.2010,  10:12 Найти цитируемый пост)
ЧЕРЕЗ ТРИГГЕРЫ КОНТРОЛИРОВАТЬ ОГРАНИЧЕНИЕ ЦЕЛОСТНОСТИ - МОЖНО ТОЛЬКО В ОДНОПОЛЬЗОВАТЕЛЬСКОЙ СРЕДЕ!

Никогда не вникал (не было практической задачи) в блокировки и транзакции, но поскольку у меня сейчас стоит похожая задача в Firebird (а он версионник), то судя по всему пришло время.

А как тогда быть?

Цитата(Zloxa @  27.9.2010,  10:12 Найти цитируемый пост)
блин, проверил на MS SQL 2000, он nullы счиатает как заначения и проверяет по ним уникальность

Не совсем понял.


--------------------
Слава Україні!
PM MAIL   Вверх
Zloxa
Дата 27.9.2010, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 10
Всего: 161



Цитата(Gluttton @  27.9.2010,  11:08 Найти цитируемый пост)
Не совсем понял. 

MS:
Код

/*------------------------
create table test(id int unique);
insert into test values (null);
insert into test values (null);
------------------------*/

(1 row(s) affected)
Msg 2627, Level 14, State 2, Line 1
Violation of UNIQUE KEY constraint 'UQ__test__6D8D5302'. Cannot insert duplicate key in object 'test'.
The statement has been terminated.

(0 row(s) affected)

оракля:
Код

SQL> create table test(id int unique);
 
Table created
SQL> insert into test values (null);
 
1 row inserted
SQL> insert into test values (null);
 
1 row inserted
SQL> insert into test values (1);
 
1 row inserted
SQL> insert into test values (1);
 
insert into test values (1)
 
ORA-00001: unique constraint (DC.SYS_C0035085) violated


PG:
Код

tst_db=# create table test(id int unique);
NOTICE:  CREATE TABLE / UNIQUE will create implicit index "test_id_key" for tabl
e "test"
CREATE TABLE
tst_db=# insert into test values (null);
INSERT 0 1
tst_db=# insert into test values (null);
INSERT 0 1
tst_db=# insert into test values (1);
INSERT 0 1
tst_db=# insert into test values (1);
ERROR:  duplicate key value violates unique constraint "test_id_key"


А как оно на FB, My?
Кто является исключением?


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Akina
Дата 27.9.2010, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



Цитата(Zloxa @  27.9.2010,  11:12 Найти цитируемый пост)
Особенностью MS является то, что ограничение уникальности по null проверяется 

Это описано в документации на MS SQL.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Gluttton
Дата 27.9.2010, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: нет
Всего: 54



Firebird:
Код

create table test (id int unique);
insert into test (id) values (null);
1 record(s) was(were) inserted into TEST

insert into test (id) values (null);
1 record(s) was(were) inserted into TEST

insert into test (id) values (1);
1 record(s) was(were) inserted into TEST

insert into test (id) values (1);
Invalid insert or update value(s): object columns are constrained - no 2 table rows can have duplicate column values.
violation of PRIMARY or UNIQUE KEY constraint "INTEG_23" on table "TEST".



--------------------
Слава Україні!
PM MAIL   Вверх
Zloxa
Дата 27.9.2010, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 10
Всего: 161



Цитата(Gluttton @  27.9.2010,  11:08 Найти цитируемый пост)
А как тогда быть?

Искуственно раскидывать блокировки,избавляясь от конкурентности сериализуя транзакции,  пытаясь избегать дедлоков.
В общем весьма не тривиальная и не всегда в полной мере реализуемая задача.
Цитата(Akina @  27.9.2010,  11:37 Найти цитируемый пост)
Это описано в документации на MS SQL. 

я в том нисколько не сомневаюсь.
мне было интересно насколько такая практика общепринята и чья реализации скорее исключение из правила  - ораклиная или ж MSSql'ная.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Gluttton
Дата 27.9.2010, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: нет
Всего: 54



Zloxa, т.е. я так понимаю, что разработчики разных СУБД писали проверку по разному, одни так:
Код

exists (select value from table where value = null)

А другие вот так:
Код

exists (select value from table where value is null)

 smile ?

Это сообщение отредактировал(а) Gluttton - 27.9.2010, 12:14


--------------------
Слава Україні!
PM MAIL   Вверх
Akina
Дата 27.9.2010, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



Цитата(Gluttton @  27.9.2010,  13:12 Найти цитируемый пост)
where value = null

По классике сравнение с null ВСЕГДА даёт false...

Добавлено через 4 минуты и 46 секунд
Цитата(Zloxa @  27.9.2010,  12:51 Найти цитируемый пост)
мне было интересно насколько такая практика общепринята 

Код

mysql> create table test (
    -> id integer auto_increment primary key,
    -> val1 integer unique,
    -> val2 integer
    -> );
Query OK, 0 rows affected (0.14 sec)

mysql> insert into test(val1, val2) values (1,1);
Query OK, 1 row affected (0.05 sec)

mysql> insert into test(val1, val2) values (2,2);
Query OK, 1 row affected (0.03 sec)

mysql> insert into test(val1, val2) values (null,3);
Query OK, 1 row affected (0.03 sec)

mysql> insert into test(val1, val2) values (null,4);
Query OK, 1 row affected (0.03 sec)

mysql> insert into test(val1, val2) values (1,5);
ERROR 1062 (23000): Duplicate entry '1' for key 2
mysql> select * from test;
+----+------+------+
| id | val1 | val2 |
+----+------+------+
|  1 |    1 |    1 |
|  2 |    2 |    2 |
|  3 | NULL |    3 |
|  4 | NULL |    4 |
+----+------+------+
4 rows in set (0.02 sec)


Цитата(Zloxa @  27.9.2010,  12:51 Найти цитируемый пост)
чья реализации скорее исключение из правила  

Видимо, надо выяснять, как к этому делу относится SQL92 =)


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 27.9.2010, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 10
Всего: 161



Цитата(Akina @  27.9.2010,  12:26 Найти цитируемый пост)
сравнение с null ВСЕГДА даёт false...

если быть чуть точнее - то unknown, либо же компромиссное "не истина".
потому как если мы сделаем чек констрейнт, который, как известно, срабатывает по false, он тоже не сработает на сравнении с null 
и, мне кажется, Gluttton, понимая это, очень даже изящно пошутил smile
Цитата(Gluttton @  27.9.2010,  12:12 Найти цитируемый пост)
  ?

Я думаю тут ноги растут от того, что в ранних версиях sql сервера, Null трактовался совсем не по ансишному и троичная логика не была в нем реализована. Некросы это вроде как объясняли тем, что они прорелизились раньше стандарта. Рудименты этого решения, для обратной совместимости, тянутся и ныне.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Gluttton
Дата 27.9.2010, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: нет
Всего: 54



Цитата(Akina @  27.9.2010,  12:26 Найти цитируемый пост)
По классике сравнение с null ВСЕГДА даёт false...

Вот это да  smile .
Код

create table test (i int);

insert into test (i) values (null);
insert into test (i) values (null);
insert into test (i) values (1);

select * from test;
[null]
[null]
1

select * from test where i = null;

select * from test where i <> null;

select * from test where i is null;
[null]
[null]


Цитата(Zloxa @  27.9.2010,  15:06 Найти цитируемый пост)
мне кажется, Gluttton, понимая это, очень даже изящно пошутил

Угу  smile .


--------------------
Слава Україні!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.2377 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.