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

Откуда:
Сообщений: 452
Добрый день, народ!

Использую SQL Express 2005

Имеются две таблицы: одна - список товаров (имеется уникальный ID товара), вторая - цена товара. Во второй таблице используется ссылка на первую, и могут быть одни и те же товары, но по разным ценам ( из-за различных поставок). Мне необходимо защитить таблицу товаров от удаления тех товаров, которые используются во второй таблице.

Я пытался настроить отношения внешнего ключа (Express на русском), вязав ID первой таблицы на MEMBER_ID второй таблицы, но SQL говорит что "Столбцы в таблице не совпадают с первичным ключом или ограничением UNIQUE"

Как быть? Или можа я не туда копаю?
3 июл 09, 16:12    [7374572]     Ответить | Цитировать Сообщить модератору
 Re: Связать таблицы, защитив данные от удаления  [new]
_raddd
Guest
видимо во 2-ой таблице есть записи не соответствующие ID в 1-ой
надо или их удалить , а потом связывать
или написать тригер на удаление для 1-ой таблицы и в нём проверяйть - что можно удалять , а что нет
3 июл 09, 16:26    [7374680]     Ответить | Цитировать Сообщить модератору
 Re: Связать таблицы, защитив данные от удаления  [new]
_djХомяГ
Guest
Построить PK или UNIQ INDEX на таблице товаров и уже потом создать FK
3 июл 09, 16:27    [7374689]     Ответить | Цитировать Сообщить модератору
 Re: Связать таблицы, защитив данные от удаления  [new]
joe black
Member

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

Щас проверю!!
3 июл 09, 16:28    [7374690]     Ответить | Цитировать Сообщить модератору
 Re: Связать таблицы, защитив данные от удаления  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2791
Копаете туда. Перед созданием внешнего ключа проверьте: для всех ли значений в таблице цен имеются значения в таблице товаров.
3 июл 09, 16:30    [7374703]     Ответить | Цитировать Сообщить модератору
 Re: Связать таблицы, защитив данные от удаления  [new]
joe black
Member

Откуда:
Сообщений: 452
joe black

Щас проверю!!


В таблице 1 оставил все записи. В таблице 2 ваще всё стёр. Всё равно не хочет ((
3 июл 09, 16:30    [7374709]     Ответить | Цитировать Сообщить модератору
 Re: Связать таблицы, защитив данные от удаления  [new]
Glory
Member

Откуда:
Сообщений: 104760
joe black
joe black

Щас проверю!!


В таблице 1 оставил все записи. В таблице 2 ваще всё стёр. Всё равно не хочет ((

Ну так вы прочитали сообщение об ошибке то ?
"Столбцы в таблице не совпадают с первичным ключом или ограничением UNIQUE" - какой у вас первичный ключо или ограничение UNIQUE у родительской таблицы ?
3 июл 09, 16:32    [7374728]     Ответить | Цитировать Сообщить модератору
 Re: Связать таблицы, защитив данные от удаления  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2791
А можно структуру таблиц и sql оператор, которым вы создаете внешний ключ.
3 июл 09, 16:33    [7374733]     Ответить | Цитировать Сообщить модератору
 Re: Связать таблицы, защитив данные от удаления  [new]
joe black
Member

Откуда:
Сообщений: 452
Glory
какой у вас первичный ключо или ограничение UNIQUE у родительской таблицы ?

ID товара в первой таблице (PRIM, UNIQ)
3 июл 09, 16:35    [7374745]     Ответить | Цитировать Сообщить модератору
 Re: Связать таблицы, защитив данные от удаления  [new]
joe black
Member

Откуда:
Сообщений: 452
Prolog
А можно структуру таблиц и sql оператор, которым вы создаете внешний ключ.

создаю из студии
TBL1:
ID (KEY) -
NAME - товар

TBL2:
ID_T - ID товара из первой таблицы
PRICE - цена
DD - дата заведения
3 июл 09, 16:37    [7374767]     Ответить | Цитировать Сообщить модератору
 Re: Связать таблицы, защитив данные от удаления  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2791
попробуйте создать запросом:
alter table TBL2 add constraint TBL2_01_FK foreign key(ID_T) references TBL1(ID)
3 июл 09, 16:44    [7374830]     Ответить | Цитировать Сообщить модератору
 Re: Связать таблицы, защитив данные от удаления  [new]
joe black
Member

Откуда:
Сообщений: 452
Prolog
попробуйте создать запросом:
alter table TBL2 add constraint TBL2_01_FK foreign key(ID_T) references TBL1(ID)


Завершено успешно! Теперь попробывать чтонить удалить? ))
3 июл 09, 16:46    [7374841]     Ответить | Цитировать Сообщить модератору
 Re: Связать таблицы, защитив данные от удаления  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2791
1. я бы вам посоветовал создать индекс на TBL2 по столбцу ID_T.
2. И не только удалить. Попробуйте в TBL2 вставить ID_T со значением, которого нет в TBL1.
3 июл 09, 16:49    [7374868]     Ответить | Цитировать Сообщить модератору
 Re: Связать таблицы, защитив данные от удаления  [new]
joe black
Member

Откуда:
Сообщений: 452
Prolog
1. я бы вам посоветовал создать индекс на TBL2 по столбцу ID_T.

Именно так я и сделал - Вашей строкой кода
Prolog
2. И не только удалить. Попробуйте в TBL2 вставить ID_T со значением, которого нет в TBL1.


Я так думаю, чтои это он отфильтрует, )) раз он не даёт удалять запись из TBL1.

А как мне прочитать ошибку и сказать пользователю нормальным языком чего от него хотят?
3 июл 09, 16:54    [7374908]     Ответить | Цитировать Сообщить модератору
 Re: Связать таблицы, защитив данные от удаления  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2791
joe black
Именно так я и сделал - Вашей строкой кода
"Моя строка" создала только внешний ключ. Индекс нужно создать отдельно.
3 июл 09, 16:57    [7374940]     Ответить | Цитировать Сообщить модератору
 Re: Связать таблицы, защитив данные от удаления  [new]
joe black
Member

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

Понял, но зачем нужен индекс, если итак всё работает!?
3 июл 09, 16:58    [7374951]     Ответить | Цитировать Сообщить модератору
 Re: Связать таблицы, защитив данные от удаления  [new]
Glory
Member

Откуда:
Сообщений: 104760
joe black

А как мне прочитать ошибку и сказать пользователю нормальным языком чего от него хотят?

Написать обработку ошибок в клиентском приложении
3 июл 09, 16:59    [7374957]     Ответить | Цитировать Сообщить модератору
 Re: Связать таблицы, защитив данные от удаления  [new]
joe black
Member

Откуда:
Сообщений: 452
Glory
Написать обработку ошибок в клиентском приложении

error_message() ??
3 июл 09, 17:01    [7374971]     Ответить | Цитировать Сообщить модератору
 Re: Связать таблицы, защитив данные от удаления  [new]
Glory
Member

Откуда:
Сообщений: 104760
joe black
Glory
Написать обработку ошибок в клиентском приложении

error_message() ??

error_message() - это серверная функция а не клиентская.
3 июл 09, 17:02    [7374978]     Ответить | Цитировать Сообщить модератору
 Re: Связать таблицы, защитив данные от удаления  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2791
joe black
Prolog,

Понял, но зачем нужен индекс, если итак всё работает!?
При большом наборе данных будет работать быстрее.
3 июл 09, 17:03    [7374990]     Ответить | Цитировать Сообщить модератору
 Re: Связать таблицы, защитив данные от удаления  [new]
joe black
Member

Откуда:
Сообщений: 452
Glory

error_message() - это серверная функция а не клиентская.


А как тогда? Если удаление записи будет производится коммандой Table1.Delete (Delphi), то я получу текст по OnError. Так?
3 июл 09, 17:05    [7375006]     Ответить | Цитировать Сообщить модератору
 Re: Связать таблицы, защитив данные от удаления  [new]
joe black
Member

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

Понял! Спасибо за совет!! )))
3 июл 09, 17:07    [7375018]     Ответить | Цитировать Сообщить модератору
 Re: Связать таблицы, защитив данные от удаления  [new]
Glory
Member

Откуда:
Сообщений: 104760
joe black
Glory

error_message() - это серверная функция а не клиентская.


А как тогда? Если удаление записи будет производится коммандой Table1.Delete (Delphi), то я получу текст по OnError. Так?

На клиенте написать блок обработки приходящих от сервера сообщений. Раз уж вы считаете, что вашему пользователю они непонятны
3 июл 09, 17:07    [7375022]     Ответить | Цитировать Сообщить модератору
 Re: Связать таблицы, защитив данные от удаления  [new]
joe black
Member

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

Понял! Так и сделаю ))) Благодарю за помощь! ))

Всем спасибо! Вопрос закрыт!
3 июл 09, 17:09    [7375035]     Ответить | Цитировать Сообщить модератору
 Re: Связать таблицы, защитив данные от удаления  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2791
joe black
А как тогда? Если удаление записи будет производится коммандой Table1.Delete (Delphi), то я получу текст по OnError. Так?
Да так. На клиенте в блоке try удаляете, в блоке except - отлавливаете ошибку.
3 июл 09, 17:10    [7375052]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить