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

Откуда:
Сообщений: 825
Здравствуйте!

Подскажите пожалуйста как можно сделать, чтобы ключ их внешней таблицы Teacher не имел дублей в TeacherSchool. Проще говоря учитель может работать только в одной школе.

Пример:

Нужно так:
TeacherId SchoolId
1 1
5 4
8 7

Так нельзя:
TeacherId SchoolId
1 1
1 4
8 7


CREATE TABLE [dbo].[School](
    [Id] [int] IDENTITY(1,1) NOT NULL
CONSTRAINT [PK_dbo.School] PRIMARY KEY CLUSTERED
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


CREATE TABLE [dbo].[Teacher](
    [Id] [int] IDENTITY(1,1) NOT NULL
CONSTRAINT [PK_dbo.Teacher] PRIMARY KEY CLUSTERED
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


CREATE TABLE [dbo].[TeacherSchool](
    [TeacherId] [int] NOT NULL,
    [SchoolId] [int] NOT NULL
CONSTRAINT [PK_dbo.TeacherSchool] PRIMARY KEY CLUSTERED
(
    [TeacherId] ASC,
    [SchoolId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [dbo].[TeacherSchool]  WITH CHECK ADD  CONSTRAINT [FK_dbo.TeacherSchool_dbo.Teacher_Id] FOREIGN KEY([TeacherId])
REFERENCES [dbo].[Teacher] ([Id])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[TeacherSchool] CHECK CONSTRAINT [FK_dbo.TeacherSchool_dbo.Teacher_Id]
GO
ALTER TABLE [dbo].[TeacherSchool]  WITH CHECK ADD  CONSTRAINT [FK_dbo.TeacherSchool_dbo.School_Id] FOREIGN KEY([SchoolId])
REFERENCES [dbo].[School] ([Id])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[TeacherSchool] CHECK CONSTRAINT [FK_dbo.TeacherSchool_dbo.School_Id]
GO
24 май 17, 09:32    [20506488]     Ответить | Цитировать Сообщить модератору
 Re: Запретить дубликаты foreign key  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Nechto,

CREATE UNIQUE NONCLUSTERED INDEX ix_TeacherId ON dbo.Teacher(TeacherId)

ну и DELETE CASCADE жуууткая штука
24 май 17, 09:37    [20506506]     Ответить | Цитировать Сообщить модератору
 Re: Запретить дубликаты foreign key  [new]
Nechto
Member

Откуда:
Сообщений: 825
TaPaK
Nechto,
ну и DELETE CASCADE жуууткая штука

Лучше No Action использовать?

А куда в скрипт нужно вставить данный скрипт
автор
CREATE UNIQUE NONCLUSTERED INDEX ix_TeacherId ON dbo.Teacher(TeacherId)
24 май 17, 09:45    [20506550]     Ответить | Цитировать Сообщить модератору
 Re: Запретить дубликаты foreign key  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Nechto
TaPaK
Nechto,
ну и DELETE CASCADE жуууткая штука

Лучше No Action использовать?

А куда в скрипт нужно вставить данный скрипт
автор
CREATE UNIQUE NONCLUSTERED INDEX ix_TeacherId ON dbo.Teacher(TeacherId)

лучше начните изучать то что пишите
24 май 17, 09:46    [20506556]     Ответить | Цитировать Сообщить модератору
 Re: Запретить дубликаты foreign key  [new]
Nechto
Member

Откуда:
Сообщений: 825
Глупый вопрос задал куда внести запись. В конец скрипта.
автор
CREATE UNIQUE NONCLUSTERED INDEX ix_TeacherId ON dbo.Teacher(TeacherId)


На счет каскада я понимаю как это работает. Только не могу понять почему delete зло?
24 май 17, 09:53    [20506591]     Ответить | Цитировать Сообщить модератору
 Re: Запретить дубликаты foreign key  [new]
iap
Member

Откуда: Москва
Сообщений: 46980
Если надо, чтобы каждый учитель всегда работал только в одной школе,
то просто надо в таблице Teacher создать поле SchoolID, которое ссылается на эту школу, и всё.
Зачем таблица TeacherSchool - непонятно.
24 май 17, 10:05    [20506638]     Ответить | Цитировать Сообщить модератору
 Re: Запретить дубликаты foreign key  [new]
aleks2
Guest
iap
Если надо, чтобы каждый учитель всегда работал только в одной школе,


Дык, так оне премрут с голоду.
24 май 17, 10:11    [20506664]     Ответить | Цитировать Сообщить модератору
 Re: Запретить дубликаты foreign key  [new]
iap
Member

Откуда: Москва
Сообщений: 46980
aleks2
iap
Если надо, чтобы каждый учитель всегда работал только в одной школе,


Дык, так оне премрут с голоду.
Эту жестокость проявляю не я.
Это Nechto так сформулировал!
24 май 17, 10:18    [20506693]     Ответить | Цитировать Сообщить модератору
 Re: Запретить дубликаты foreign key  [new]
iap
Member

Откуда: Москва
Сообщений: 46980
iap
aleks2
пропущено...


Дык, так оне премрут с голоду.
Эту жестокость проявляю не я.
Это Nechto так сформулировал!
Но он даёт учителю иллюзорную надежду
таблицей связей учителя со школами.
А это уже пытка!
24 май 17, 10:21    [20506706]     Ответить | Цитировать Сообщить модератору
 Re: Запретить дубликаты foreign key  [new]
Nechto
Member

Откуда:
Сообщений: 825
Братцы, это же я для примера привел :)
А если ближе к жизни, то репетиторство ни кто не запрещал.
24 май 17, 10:30    [20506750]     Ответить | Цитировать Сообщить модератору
 Re: Запретить дубликаты foreign key  [new]
Nechto
Member

Откуда:
Сообщений: 825
TaPaK
Nechto,
ну и DELETE CASCADE жуууткая штука


В общем это все таки субъективное мнение. В моей базе данных и безе, которую я проектирую cascade использую во многих связках.
Соглашусь только с одним, если нет графической схемы базы данных со всеми PK FK и (cascade или no action). То да разобраться в такой базе очень сложно.
24 май 17, 13:15    [20507649]     Ответить | Цитировать Сообщить модератору
 Re: Запретить дубликаты foreign key  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Nechto
TaPaK
Nechto,
ну и DELETE CASCADE жуууткая штука


В общем это все таки субъективное мнение. В моей базе данных и безе, которую я проектирую cascade использую во многих связках.
Соглашусь только с одним, если нет графической схемы базы данных со всеми PK FK и (cascade или no action). То да разобраться в такой базе очень сложно.

ага, любой случайный попугай способен очистить вам всю базу.
24 май 17, 13:18    [20507671]     Ответить | Цитировать Сообщить модератору
 Re: Запретить дубликаты foreign key  [new]
Nechto
Member

Откуда:
Сообщений: 825
TaPaK
ага, любой случайный попугай способен очистить вам всю базу.


С другой стороны, оставшиеся кусочки цепочки-связей мало полезны. Если криворукому дать волю, он и без каскада данные сотрет.
Я всегда полагаюсь только на резервное копирование, для меня это самый надежный способ восстановить данные. Другие это велосипед.
24 май 17, 15:15    [20508256]     Ответить | Цитировать Сообщить модератору
 Re: Запретить дубликаты foreign key  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Nechto
TaPaK
ага, любой случайный попугай способен очистить вам всю базу.


С другой стороны, оставшиеся кусочки цепочки-связей мало полезны. Если криворукому дать волю, он и без каскада данные сотрет.
Я всегда полагаюсь только на резервное копирование, для меня это самый надежный способ восстановить данные. Другие это велосипед.

бохпомощ. Удалять с реферансами то ещё удовольствие, каскадное удаление лучший помощник воспользоваться бекапом, вы становитесь незаменимым :)
24 май 17, 15:20    [20508274]     Ответить | Цитировать Сообщить модератору
 Re: Запретить дубликаты foreign key  [new]
invm
Member

Откуда: Москва
Сообщений: 9349
TaPaK
ну и DELETE CASCADE жуууткая штука
Любители каскадов бывают простые и идейные.
Идейным что-либо доказывать бесполезно :)
24 май 17, 15:21    [20508278]     Ответить | Цитировать Сообщить модератору
 Re: Запретить дубликаты foreign key  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
invm
TaPaK
ну и DELETE CASCADE жуууткая штука
Любители каскадов бывают простые и идейные.
Идейным что-либо доказывать бесполезно :)

аминь :)
24 май 17, 15:21    [20508279]     Ответить | Цитировать Сообщить модератору
 Re: Запретить дубликаты foreign key  [new]
Nechto
Member

Откуда:
Сообщений: 825
TaPaK
invm
пропущено...
Любители каскадов бывают простые и идейные.
Идейным что-либо доказывать бесполезно :)

аминь :)


Я же не настаиваю :) каждый выбирает свой путь самурая :)
24 май 17, 15:28    [20508311]     Ответить | Цитировать Сообщить модератору
 Re: Запретить дубликаты foreign key  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Nechto
Я же не настаиваю :) каждый выбирает свой путь самурая :)

почему вы глупость называете как-то иначе?
24 май 17, 15:38    [20508342]     Ответить | Цитировать Сообщить модератору
 Re: Запретить дубликаты foreign key  [new]
Гузы
Guest
Nechto
Здравствуйте!

Подскажите пожалуйста как можно сделать, чтобы ключ их внешней таблицы Teacher не имел дублей в TeacherSchool. Проще говоря учитель может работать только в одной школе.
...

[/src]


off
Что-то мне подсказывает, что учитель может работать в разных школах. В прошлом месяце - в одной, а в этом - в другой. Или они сидят под арестом?

Впрочем, это никакого отношения к обсуждению каскада и вообще sql не имеет.
24 май 17, 15:54    [20508421]     Ответить | Цитировать Сообщить модератору
 Re: Запретить дубликаты foreign key  [new]
invm
Member

Откуда: Москва
Сообщений: 9349
Nechto
Я всегда полагаюсь только на резервное копирование, для меня это самый надежный способ восстановить данные.
1. Сделали бекап.
2. Из-за невыявленной при тестировании ошибки, некто сумел удалить некую сущность вместе с ее дочерними сущностями.
3. Сделали бекап. Бекап из п. 1 за ненадобностью удалили.
4. Обнаружили отсутствие сущности из п.2 и ее дочерних сущностей.
5. Вызвали Nechto. Он пришел по пути самурая, с намерением восстановить порушенное...
24 май 17, 16:04    [20508486]     Ответить | Цитировать Сообщить модератору
 Re: Запретить дубликаты foreign key  [new]
Владислав Колосов
Member

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

когда начнете удалять свой первый миллион с внешними ключами на 20-30 таблиц - задумаетесь о правильности выбранного пути.
24 май 17, 17:53    [20508981]     Ответить | Цитировать Сообщить модератору
 Re: Запретить дубликаты foreign key  [new]
Nechto
Member

Откуда:
Сообщений: 825
Убедили :)
Я серьезно.
25 май 17, 06:59    [20509874]     Ответить | Цитировать Сообщить модератору
 Re: Запретить дубликаты foreign key  [new]
Nechto
Member

Откуда:
Сообщений: 825
Чаще всего я использую схему с полем isvisible(true false). Запись не удаляю, а просто изменяю статус строки. И в запросах её отсекаю.
25 май 17, 07:05    [20509877]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить