Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Связь таблиц / 6 сообщений из 6, страница 1 из 1
02.06.2019, 09:42
    #39821263
eleau
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь таблиц
Код: 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.
34.
35.
36.
37.
38.
39.
CREATE TABLE Type_instrumenta
(
    Kod_type_instrumenta INT NOT NULL PRIMARY KEY IDENTITY(1,1),
    Nazvanie_type_instrumenta VARCHAR(20) NOT NULL DEFAULT 'akzii',
    UNIQUE (Nazvanie_type_instrumenta),
    CHECK (Nazvanie_type_instrumenta IN ('akzii', 'futures'))
);
 
CREATE TABLE Instruments
(
    Kod_instrumenta INT NOT NULL PRIMARY KEY IDENTITY(2,3),
    Nazvanie_instrumenta VARCHAR(20) NOT NULL,
    Kod_Type_instrumenta INT NOT NULL DEFAULT 'akzii',
    CHECK (Nazvanie_instrumenta LIKE CASE WHEN Nazvanie_type_instrumenta = 'futures' THEN '[a-zA-Zа-яА-Я][a-zA-Zа-яА-Я]-[0-9].' + RIGHT(str(YEAR(getdate())), 2) ELSE '%' END),
    FOREIGN KEY (Kod_type_instrumenta) REFERENCES Type_instrumenta(Kod_type_instrumenta) ON DELETE cascade
);
 
CREATE TABLE Schet
(
    Nomer_scheta INT NOT NULL PRIMARY KEY IDENTITY(10000000,1) CHECK (Nomer_scheta <= 99999999),
    familia VARCHAR(20) NOT NULL,
    imya VARCHAR(20) NOT NULL,
    otchestvo VARCHAR(20) NOT NULL
);
 
CREATE TABLE Sdelki
(
    Kod_sdelki INT NOT NULL PRIMARY KEY IDENTITY(1,1),
    nomer_scheta INT NOT NULL,
    FOREIGN KEY (nomer_scheta) REFERENCES Schet(nomer_scheta) ON DELETE cascade,
    datavremya_otkrytiya datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
    datavremya_zakrytiya datetime NULL,
    kolichestvo REAL CHECK (kolichestvo>0),
    Kod_instrumenta INT NOT NULL,
    FOREIGN KEY (Kod_instrumenta) REFERENCES Instruments(Kod_instrumenta) ON DELETE cascade,
    napravlenie_sdelki VARCHAR(10) NOT NULL DEFAULT 'long' 
    CHECK (napravlenie_sdelki IN ('long', 'short')),
    CHECK (datavremya_zakrytiya > datavremya_otkrytiya)
);



Как правильно сослаться при создании таблицы Instruments на поле Nazvanie_type_instrumenta, находящееся в таблице Type_Instrumenta, без добавления этого поля в таблицу Instruments? Если название типа инструмента = futures (из первой таблицы), то название инструмента имеет такой-то формат (вторая таблица)
...
Рейтинг: 0 / 0
02.06.2019, 13:08
    #39821292
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь таблиц
eleau,

Ван нужна таблица соответствий типов и инструментов, а для проверочного ограничения создайте скалярную функцию, которая будет выполнять запрос по связке Instruments.Nazvanie_instrumenta - новая таблица - Type_instrumenta.Nazvanie_type_instrumenta .
...
Рейтинг: 0 / 0
02.06.2019, 20:51
    #39821381
eleau
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь таблиц
Владислав Колосов,

что за функция?
...
Рейтинг: 0 / 0
03.06.2019, 10:25
    #39821515
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь таблиц
eleau,
Что за извращение
Код: sql
1.
Kod_instrumenta INT NOT NULL PRIMARY KEY IDENTITY(2,3)


Не взлетит
Код: sql
1.
od_Type_instrumenta INT NOT NULL DEFAULT 'akzii',


Нафиг не нужно
Код: sql
1.
Kod_type_instrumenta INT NOT NULL PRIMARY KEY IDENTITY(1,1),



Масло масляное
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE Type_instrumenta
(
    Kod_type_instrumenta INT NOT NULL PRIMARY KEY IDENTITY(1,1),
    Nazvanie_type_instrumenta VARCHAR(20) NOT NULL DEFAULT 'akzii',
    UNIQUE (Nazvanie_type_instrumenta),
    CHECK (Nazvanie_type_instrumenta IN ('akzii', 'futures'))
);



Итого, таблица type_instuments нафиг не нужна. kod_type_instrumenta тоже не нужен.
Вывод, студент - балбес. Садись, два.
...
Рейтинг: 0 / 0
03.06.2019, 12:51
    #39821608
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь таблиц
eleauВладислав Колосов,

что за функция?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
-- проверка
create function dbo.fn1 (@Nazvanie_instrumenta)
returns int
begin
   if exists (select from b join Type_instrumenta ... where Nazvanie_type_instrumenta = 'futures' and @Nazvanie_instrumenta like ....)
      return (1)
   else
      return (0)
end

check (dbo.fn1() = 1 and )



Как-то так. Но, как писали выше, таблица типов может быть избыточна. Однако, с применением функции можно расширять проверки имён для типов без переписывания кода, если шаблон имени сохранить в таблице типов. В этом случае достаточно будет добавить новый тип с определением шаблона в таблицу типов.
...
Рейтинг: 0 / 0
03.06.2019, 12:52
    #39821610
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь таблиц
eleau,

допилите напильником по потребности, за Вас никто решение писать не будет ;)
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Связь таблиц / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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