Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Связь таблиц  [new]
eleau
Member

Откуда:
Сообщений: 11
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 (из первой таблицы), то название инструмента имеет такой-то формат (вторая таблица)

Сообщение было отредактировано: 2 июн 19, 10:24
2 июн 19, 09:42    [21899719]     Ответить | Цитировать Сообщить модератору
 Re: Связь таблиц  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7752
eleau,

Ван нужна таблица соответствий типов и инструментов, а для проверочного ограничения создайте скалярную функцию, которая будет выполнять запрос по связке Instruments.Nazvanie_instrumenta - новая таблица - Type_instrumenta.Nazvanie_type_instrumenta .
2 июн 19, 13:08    [21899761]     Ответить | Цитировать Сообщить модератору
 Re: Связь таблиц  [new]
eleau
Member

Откуда:
Сообщений: 11
Владислав Колосов,

что за функция?
2 июн 19, 20:51    [21899924]     Ответить | Цитировать Сообщить модератору
 Re: Связь таблиц  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
eleau,
Что за извращение
Kod_instrumenta INT NOT NULL PRIMARY KEY IDENTITY(2,3)

Не взлетит
od_Type_instrumenta INT NOT NULL DEFAULT 'akzii',

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


Масло масляное
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 тоже не нужен.
Вывод, студент - балбес. Садись, два.
3 июн 19, 10:25    [21900170]     Ответить | Цитировать Сообщить модератору
 Re: Связь таблиц  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7752
eleau
Владислав Колосов,

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


-- проверка
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 )


Как-то так. Но, как писали выше, таблица типов может быть избыточна. Однако, с применением функции можно расширять проверки имён для типов без переписывания кода, если шаблон имени сохранить в таблице типов. В этом случае достаточно будет добавить новый тип с определением шаблона в таблицу типов.
3 июн 19, 12:51    [21900358]     Ответить | Цитировать Сообщить модератору
 Re: Связь таблиц  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7752
eleau,

допилите напильником по потребности, за Вас никто решение писать не будет ;)
3 июн 19, 12:52    [21900360]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить