Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/33: Рейтинг темы: голосов - 33, средняя оценка - 4.94
3 / 3 / 0
Регистрация: 27.11.2010
Сообщений: 54

Как создать внешний ключ в таблице?

15.04.2011, 15:04. Показов 7009. Ответов 37
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть готовая таблица на основе СУБД Paradox 7, созданная через Database Desktop.
Помогите пожалуйста: как создать в этой таблице поле с внешним ключом?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.04.2011, 15:04
Ответы с готовыми решениями:

Первичный ключ заполнен в одной таблице норм, он же в другой таблице внешний NULL
Всем доброго времени суток! Проблема следующая: Использую "SQL server management studio 2012", есть бекап базы данных с которой...

Создание локальной БД: как создать внешний ключ
Здравствуйте. Решил создать БД, нужно, чтобы работало на любом комьютере, в т.ч. без интернета, поэтому нужно создать локальную БД. Все...

Как создать внешний ключ для таблицы?
Скажу сразу, эта тема есть в разделе php и базы данных, но там никто не отвечает, может тут знают:) В общем вопрос следующий: как создать...

37
283 / 262 / 32
Регистрация: 11.11.2009
Сообщений: 605
15.04.2011, 16:50
Цитата Сообщение от Lacrimossa Посмотреть сообщение
Есть готовая таблица на основе СУБД Paradox 7, созданная через Database Desktop.
Помогите пожалуйста: как создать в этой таблице поле с внешним ключом?
In DataBase Desktop:
  • Open Table
  • Restructure
  • Table properties -> Referential Integrity
  • выберите поля в вашей таблице и другую таблицу с primary key полями для соединения
  • Ok, Назовите. Сохраните таблицу. Все.

Внимание, это все в Парадоксе работает только теоретически. Практически - только головная боль и неудобства. Не рекомендую.
1
3 / 3 / 0
Регистрация: 27.11.2010
Сообщений: 54
15.04.2011, 17:05  [ТС]
In DataBase Desktop:

Open Table
Restructure
Table properties -> Referential Integrity
выберите поля в вашей таблице и другую таблицу с primary key полями для соединения
Ok, Назовите. Сохраните таблицу. Все.


Внимание, это все в Парадоксе работает только теоретически. Практически - только головная боль и неудобства. Не рекомендую.
Блаодарю. Но у меня кнопка Ок не работает почему-то =__= Вроде всё верно выбираю,но она ни в какую не рабочая. Что я делаю не так??? =__=
0
283 / 262 / 32
Регистрация: 11.11.2009
Сообщений: 605
15.04.2011, 17:10
Цитата Сообщение от Lacrimossa Посмотреть сообщение
Блаодарю. Но у меня кнопка Ок не работает почему-то =__= Вроде всё верно выбираю,но она ни в какую не рабочая. Что я делаю не так??? =__=
хоть картинку сбросьте, чтоб можно было предположение сделать
И может таблицы тоже...
1
3 / 3 / 0
Регистрация: 27.11.2010
Сообщений: 54
15.04.2011, 17:29  [ТС]
new_in_net, вот, как и просили:

Структуры таблиц:




И сама картинка с нерабочим ОК-еем:



Добавлено через 3 минуты
Поясняю, для чего мне вообще нужен внешний ключ.
В общем в таблице GLAVN есть поле Pole2 - мне нужно, что бы в нём как Lookup-поле отображалось содержимое поля Poles из таблицы Pob. Вот чтобы их связать - нужен тот самый внешний ключ.
0
283 / 262 / 32
Регистрация: 11.11.2009
Сообщений: 605
15.04.2011, 18:07
Цитата Сообщение от Lacrimossa Посмотреть сообщение
new_in_net, вот, как и просили:

Структуры таблиц:




И сама картинка с нерабочим ОК-еем:



Добавлено через 3 минуты
Поясняю, для чего мне вообще нужен внешний ключ.
В общем в таблице GLAVN есть поле Pole2 - мне нужно, что бы в нём как Lookup-поле отображалось содержимое поля Poles из таблицы Pob. Вот чтобы их связать - нужен тот самый внешний ключ.
для того чтоб это реализовать в Делфи эта связь не нужна.
Эта связь исключительно для защиты ваших данных от ввода некорректных данных, и то она работает через пень-колоду.
Мой совет - либо перейдите на более серьезную БД, где это действительно можно реализовать, либо (если это не так важно) забудьте и в программе создавайте LookUp поля
(картинки с этого сайта я на работе не вижу - блокируются. Лучше прикрепляйте атачментом)
1
3 / 3 / 0
Регистрация: 27.11.2010
Сообщений: 54
15.04.2011, 18:21  [ТС]
Цитата Сообщение от new_in_net Посмотреть сообщение
для того чтоб это реализовать в Делфи эта связь не нужна.
Эта связь исключительно для защиты ваших данных от ввода некорректных данных, и то она работает через пень-колоду.
Мой совет - либо перейдите на более серьезную БД, где это действительно можно реализовать, либо (если это не так важно) забудьте и в программе создавайте LookUp поля
(картинки с этого сайта я на работе не вижу - блокируются. Лучше прикрепляйте атачментом)
Дело в том, что я уже пробовала создавать просто лукап-поля.
На этом форуме даже ТЕМА ЕСТЬ где меня консультировали по этому поводу. НО!
Заметьте, ЧЕМ закончилась тема: лукап-поля отображаются и работают, НО из-за соответствующей выбранной записи в поле ID главной таблице меняется на соответствующее значние ID_p Из второй. А мне надо чтобы этой взаимосвязи между ID-полями таблиц просто НЕ БЫЛО, иными словами: чтобы лукап-поле в поле-2 работало, но ID при этом не менялось.

Не получив ответа здесь, я обратилась на другой форум и там мне посоветовали использовать для этого внешние ключи.

П.С. до меня дошло, в чём ошибка: связь должна быть 1 к 1... =__=
Миниатюры
Как создать внешний ключ в таблице?   Как создать внешний ключ в таблице?   Как создать внешний ключ в таблице?  

0
283 / 262 / 32
Регистрация: 11.11.2009
Сообщений: 605
15.04.2011, 18:34
В столбце Child Fields оставьте только поле Pole2, соответствующее ID из Pob.DB.
(почитаю ту тему чуть попозже - напишу)

Добавлено через 4 минуты
Lacrimossa,
почитал тему, я там даже написал одно сообщение
вы можете просто описать словами, что вы хотите сделать, без указания технологий и т.д. - может тогда станет ясно что вам посоветовать. Мне кажется что то что вы ищите - гораздо проще, чем то что вы спрашиваете
1
3 / 3 / 0
Регистрация: 27.11.2010
Сообщений: 54
15.04.2011, 19:36  [ТС]
new_in_net, я так и сделала, но пока у меня всё равно есть эта несчастная связь с ID первой таблицы - буду эксперементировать...

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

Я научилась создавать эти списки, но теперь у меня "зависмость" по этим несчастным айди, от которых я никак не могу избавиться...
0
283 / 262 / 32
Регистрация: 11.11.2009
Сообщений: 605
15.04.2011, 19:48
Может так попытаться сформулировать:

есть несколько таблиц, нужно показать данные одной из таблиц в Гриде (табличной форме).
При редактированиии некоторые ячейки грида должны иметь выпадающие списки с данными из других таблиц.
Причем эти списки должны быть "не жесткими" и не завязанными на ID, т.е. поведение должно быть скорее как в адресной строке интернет браузера - он приносит список адресов где мы были, мы можем выбрать или выбрать и изменить на новый и никаких ID.

Похоже на это?
1
3 / 3 / 0
Регистрация: 27.11.2010
Сообщений: 54
15.04.2011, 19:53  [ТС]
Похоже на это?
new_in_net, именно это!

Я знаю что объяснять не умею... Извините =_=
0
283 / 262 / 32
Регистрация: 11.11.2009
Сообщений: 605
15.04.2011, 22:25
Цитата Сообщение от Lacrimossa Посмотреть сообщение
new_in_net, именно это!

Я знаю что объяснять не умею... Извините =_=
В компонентах DeveloperExpress есть уже готовый грид и LookupCombo который позволяет связывать поле с таблицей как PickupList...

Если же использовать стандартный TDBGrid, то единственный вариант который я вижу - использовать свойство PickList у столбца грида. Т.е. заполнять его из вспомогательных таблиц при загрузке формы.

Простой пример приатачил.
Запустите и попытайтесь редактировать поле Pole1.
В связи с тем, что у меня нет ваших данных, я использовал "таблицы в памяти" (TClientDataSet) и заполнял вспомогательную таблицу данными.
В дальнейшем вам функцию CreateAndFillTables естественно запускать не нужно.
1
3 / 3 / 0
Регистрация: 27.11.2010
Сообщений: 54
15.04.2011, 22:34  [ТС]
new_in_net, вот как... понятно, спасибо...
Эээ... А где сам пример то?
0
283 / 262 / 32
Регистрация: 11.11.2009
Сообщений: 605
15.04.2011, 22:38
странно... вроде как загрузил....
Дубль 2
Вложения
Тип файла: zip ComboBoxDemo.zip (3.5 Кб, 14 просмотров)
1
3 / 3 / 0
Регистрация: 27.11.2010
Сообщений: 54
15.04.2011, 23:03  [ТС]
Цитата Сообщение от new_in_net Посмотреть сообщение
странно... вроде как загрузил....
Дубль 2
new_in_net, но мне же надо чтобы данные брались из другой таблицы с возможностью редактирования...
Вот мой исходник
Вложения
Тип файла: rar Копия Проба.rar (335.4 Кб, 10 просмотров)
0
283 / 262 / 32
Регистрация: 11.11.2009
Сообщений: 605
15.04.2011, 23:25
Цитата Сообщение от Lacrimossa Посмотреть сообщение
new_in_net, но мне же надо чтобы данные брались из другой таблицы с возможностью редактирования...
Вот мой исходник
пробуем новый приатаченный вариант
Вложения
Тип файла: zip ComboBoxDemoUnit.zip (4.9 Кб, 13 просмотров)
1
3 / 3 / 0
Регистрация: 27.11.2010
Сообщений: 54
15.04.2011, 23:32  [ТС]
new_in_net, хмм, а вариант вполне подходящий! Спасибо!
А не мог бы ты мне всё пошагово расписать это, что и как мне делать?
0
283 / 262 / 32
Регистрация: 11.11.2009
Сообщений: 605
15.04.2011, 23:45
Цитата Сообщение от Lacrimossa Посмотреть сообщение
new_in_net, хмм, а вариант вполне подходящий! Спасибо!
А не мог бы ты мне всё пошагово расписать это, что и как мне делать?
  • На главную форму кладем DBGrid
  • создаем в нем столбцы и прописываем поля от таблицы Glav
  • на столбце где должен быть Lookup свойство ButtonStyle выставляем в cbsEclips
  • У DBGridа создаем событие EditButtonClick, в котором вызываем следующее окно в режиме ShowModal
  • В следующем окне есть грид с таблицей элементов выбора, с возможностью добавления/редактирования/удаления
  • И кнопки "Выбрать", "Отменить" с разными ModalResult
  • По возвращении проверяем какая кнопка была нажата, и если "Выбрать" , то полю Pole1 присваиваем текущее значение поля Poles из вспомогательной таблицы.
  • Если таких Lookup полей больше одного, то чтоб определить какое было нажато надо проверять свойство SelectedColumn (?) у DBGrid

Все...
2
3 / 3 / 0
Регистрация: 27.11.2010
Сообщений: 54
15.04.2011, 23:58  [ТС]
new_in_net, спасибо, сейчас попробую сама сделать.
Если таких Lookup полей больше одного, то чтоб определить какое было нажато надо проверять свойство SelectedColumn (?) у DBGrid
Как именно? У меня больше одного...
0
283 / 262 / 32
Регистрация: 11.11.2009
Сообщений: 605
16.04.2011, 00:08
Цитата Сообщение от Lacrimossa Посмотреть сообщение
new_in_net, спасибо, сейчас попробую сама сделать.


Как именно? У меня больше одного...
A Lookup окошек должно быть много или одно для всех?
Следующий код вам даст возможность определить поле на котором была нажата кнопка редактирования:
Delphi
1
DBGrid1.Fields[DBGrid1.SelectedIndex].FieldName
если lookup один на всех, то код можно поменять на следующий:

Delphi
1
2
3
4
5
6
7
procedure TForm1.DBGrid1EditButtonClick(Sender: TObject);
begin
  if Form2.ShowModal <> mrOk then
    exit;
  cdsGlav.Edit;
  cdsGlav.FieldByName(DBGrid1.Fields[DBGrid1.SelectedIndex].FieldName).AsString := cdsPod.FieldByName('Poles').AsString;
end;
если же разный, то надо будет создать третью-четвертую форму и в обработчике в зависимости от поля вызывать ту или иную форму

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure TForm1.DBGrid1EditButtonClick(Sender: TObject);
var
  EditField: string;
begin
  EditField := DBGrid1.Fields[DBGrid1.SelectedIndex].FieldName;
  if SameText(EditField, 'Pole1') then begin
    if Form2.ShowModal <> mrOk then
      exit;
    cdsGlav.Edit;
    cdsGlav.FieldByName(EditField).AsString := cdsPod.FieldByName('Poles').AsString;
  end;
 
  if SameText(EditField, 'Pole2') then begin
    if Form3.ShowModal <> mrOk then
      exit;
    cdsGlav.Edit;
    cdsGlav.FieldByName(EditField).AsString := cdsPod2.FieldByName('Poles').AsString;
  end;
 
end;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.04.2011, 00:08
Помогаю со студенческими работами здесь

Дублируются записи в таблице(таблица имеет внешний ключ)
При добавлении двух разных записей -эти записи дублируются. Вот видео ...

Выбрать все ид(внешний ключ) которых нет во второй таблице
Есть две таблицы. Таб_1: т1_1... 1 2 // !!! 3 Таб_2: т2_1, т1_1,... 1 1

Не удается создать внешний ключ
ALTER TABLE Krossirovka ADD FOREIGN KEY (ObjectFrom_ID) REFERENCES Object (Object_ID) не выполняется. Пишет &quot;The ALTER TABLE...

Создать внешний ключ из двух полей, одно с конкретным значением
Здравствуйте. Не силен в работе с БД. Скажите, Можно ли Создать внешний ключ из двух полей, чтобы одно было с конкретным значением? ...

Как добавить внешний ключ?
Здравствуйте. Есть гостевая. В БД есть 2 таблицы - зарегистрированные пользователи(табл.1 reg_users) + ихние сообщения(табл.2 message)....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru