YaKotikTvoy
@YaKotikTvoy
Стьюдик

Как указать внешний ключ?

Как указать взять в качестве внешнего ключа столбец [Название тарифа] из таблицы [Тарифы всех провайдеров]?
spoiler
create table Клиент
(
	id_client int primary key,
	Фамилия nvarchar(30) not null,
	Имя nvarchar(20) not null,
	Отчество nvarchar(20) not null,
	Паспорт bigint not null,
	Адрес nvarchar(100) null
)
create table Провайдеры
(
	[Название провайдера] nvarchar(50) primary key,
	[Название суб провайдера] nvarchar(50) null,
	[ФИО директора] nvarchar(50) not null,
	[Телефон директора] integer not null,
	ОКПО integer not null
)
create table [Тарифы всех провайдеров]
(
	[Название тарифа] nvarchar(50) primary key,
  Скорость integer not null,
  Плата integer not null, 
  Тип nvarchar(50) not null check ( Тип in 
  ('Проводной/Лимитный', 
 'Проводной/безлимитный', 
 'Беспроводной/Лимитный',
 'Беспроводной/Безлимитный'))
)
create table [Провайдер Тариф]
(
	[Название провайдера] nvarchar(50) primary key references Провайдеры([Название провайдера]),
	[Название тарифа] nvarchar(50) references [Тарифы всех провайдеров]([Название тарифа])
)
create table Договор
(
	[номер договора] integer,
	id_client integer references Клиент(id_client),
	Провайдер nvarchar(50) references [Провайдер Тариф]([Название провайдера]),
	[Название тарифа] nvarchar(50) references [Провайдер Тариф]([Название тарифа])
/*Вот здесь пишет 
There are no primary key or candidate keys on referenced table ''Провайдер Тариф' 
that match the referencing column in the foreign key ...*/
	primary key([номер договора], id_client),
	constraint Dogovor_Client_deletCascade 
	foreign key (id_client) references Клиент 
	on delete cascade 
	on update cascade
)
  • Вопрос задан
  • 79 просмотров
Решения вопроса 1
tsklab
@tsklab Куратор тега SQL Server
Здесь отвечаю на вопросы.
[Провайдер] nvarchar(50) references [Провайдеры]([Название провайдера])
[Название тарифа] nvarchar(50) references [Тарифы всех провайдеров]([Название тарифа])


Но можно и составной естественный ключ:
CREATE TABLE [Клиент]
  ( id_client INT PRIMARY KEY,
    [Фамилия] NVARCHAR(30) NOT NULL,
    [Имя] NVARCHAR(20) NOT NULL,
    [Отчество] NVARCHAR(20) NOT NULL,
    [Паспорт] NVARCHAR(MAX) NOT NULL,
    [Адрес] NVARCHAR(MAX) NULL )

CREATE TABLE [Провайдер]
  ( [Название] NVARCHAR(50) PRIMARY KEY,
    [Название суб-провайдера] NVARCHAR(50) NULL,
    [ФИО директора] NVARCHAR(100) NOT NULL,
    [Телефон директора] CHAR(10) NOT NULL,
    [ОКПО] CHAR(10) NOT NULL )

CREATE TABLE [Тариф]
  ( [Название] NVARCHAR(50) PRIMARY KEY,
    [Скорость] INT NOT NULL,
    [Стоимость] MONEY NOT NULL, 
    [Тип] NVARCHAR(50) NOT NULL CHECK ( [Тип] in 
                                      ( 'Проводной/Лимитный', 
                                        'Проводной/безлимитный', 
                                        'Беспроводной/Лимитный',
                                        'Беспроводной/Безлимитный' )))

CREATE TABLE [Провайдер Тарифа]
  ( [Название провайдера] NVARCHAR(50) REFERENCES [Провайдер] ([Название]),
    [Название тарифа] NVARCHAR(50) REFERENCES [Тариф]([Название])
    PRIMARY KEY ( [Название провайдера],
	                [Название тарифа]))

CREATE TABLE [Договор]
  ( [Номер] INT,
    id_client INT,
    [Провайдер] NVARCHAR(50),
    [Тариф] NVARCHAR(50)
    PRIMARY KEY ([Номер], id_client),
    CONSTRAINT [Договор Клиент]
      FOREIGN KEY (id_client) REFERENCES [Клиент] 
        ON DELETE CASCADE, 
    FOREIGN KEY([Провайдер], [Тариф]) 
      REFERENCES [Провайдер Тарифа] ([Название провайдера], [Название тарифа]))
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы