Форум программистов, компьютерный форум, киберфорум
Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 20.01.2021
Сообщений: 8
1

Проблема с внешним ключом

22.06.2022, 12:11. Показов 919. Ответов 12

Author24 — интернет-сервис помощи студентам
Добрый день!
Я работаю над своим проектом по спортивной аналитике. Решил перенести готовые таблицы csv в MySQL и связать их между собой. Я так понял, они должны связываться через внешний ключ с родительской таблицей. А теперь вопрос. Можно ли сделать так, чтобы значение внешнего ключа прописывался (определялся) автоматически? Или его значение должно быть изначально внесено в загружаемую таблицу?

Почему второй вариант меня не устраивает?

Например у меня есть родительская таблица, которая содержит 600 строк:

SQL
1
2
3
4
5
6
7
CREATE TABLE all_events
(
    event_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name_event VARCHAR (256) NOT NULL,
    DATE VARCHAR (64) NOT NULL,
    location VARCHAR (128) NOT NULL     
);
Каждая запись имеет связь "один ко многим" с таблицей:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE all_fightings
(
    fightind_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    Name_event VARCHAR (256) NOT NULL,
    Fighter_1 VARCHAR (64) NOT NULL,
    Fighter_2 VARCHAR (64) NOT NULL,
    Winner VARCHAR (64) NOT NULL,
    Weight VARCHAR (64) NOT NULL,
    Method VARCHAR (64) NOT NULL,
    Stroke VARCHAR (64) NOT NULL,
    Round VARCHAR (64) NOT NULL,
    TIME VARCHAR (64) NOT NULL     
)
Во второй таблице уже будет 6000 строк. И так еще 2 таблицы. Я конечно могу выкрутиться и просчитать какие ID будет выдавать MySQL и прописать их в изначальной таблице CSV, но неужели нет более элегантного решения? Например, SQL должна ориентироваться на значение столбца Name_event из первой и второй таблицы, и на основании этого выдавать второй таблице соответствующий внещний ключ? Или что-то в этом духе?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.06.2022, 12:11
Ответы с готовыми решениями:

Добавление записи с внешним ключом в БД
Привет всем! Нужен совет, а то не получается кое-что. Такой трабл: есть две таблички - users и...

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

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

Не получается составить запрос с внешним ключом на одно поле
Здравствуйте.Понимаю , что название темы пустое, но не знаю как описать емко. Есть запрос...

12
399 / 234 / 87
Регистрация: 28.04.2022
Сообщений: 1,177
22.06.2022, 12:26 2
Цитата Сообщение от AndrewNovi Посмотреть сообщение
SQL должна ориентироваться на значение столбца Name_event из первой и второй таблицы, и на основании этого выдавать второй таблице соответствующий внещний ключ? Или что-то в этом духе?
Коллега, искусственный интеллект ещё не настолько проник в IT, как об этом трубят из всех утюгов.
У вас таблица all_fightings должна содержать ID записей из таблицы all_events. Сейчас этого нет.
Я не знаю вашу задачу, но могу предположить, что надо ещё подумать над архитектурой. Может что-то надо изменить.
1
0 / 0 / 0
Регистрация: 20.01.2021
Сообщений: 8
22.06.2022, 12:49  [ТС] 3
Нет, то что там не хватает столбца, я знаю. Я пытался его добавлять после созжания таблицы:
SQL
1
2
3
ALTER TABLE all_fighting ADD all_events_id INT NOT NULL;
ALTER TABLE all_fighting 
ADD FOREIGN KEY (all_events_id) REFERENCES all_events(event_id) ON DELETE CASCADE;
Но без внесенных изначально данных, он бесполезен. Я так пытался эксперементировать в надежде, что найду решение))) Но пока ничего кроме как изначально задавать в csv таблице значения ключей, а не придумал...
0
625 / 267 / 116
Регистрация: 12.04.2022
Сообщений: 958
22.06.2022, 12:56 4
Цитата Сообщение от AndrewNovi Посмотреть сообщение
Но пока ничего кроме как изначально задавать в csv таблице значения ключей, а не придумал...
Озвучьте задачу, которую пытаетесь решить.
0
0 / 0 / 0
Регистрация: 20.01.2021
Сообщений: 8
22.06.2022, 13:21  [ТС] 5
Я спарсил таблицы в виде csv файлов. Теперь хочу загрузить их в локальный MySQL, чтобы делать выборки и т.д. Их нужно связать между собой. Как я понимаю, это делается через внешние ключи. Я создал родительскую таблицу
Цитата Сообщение от AndrewNovi Посмотреть сообщение
CREATE TABLE all_events
(
    event_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name_event VARCHAR (256) NOT NULL,
    DATE VARCHAR (64) NOT NULL,
    location VARCHAR (128) NOT NULL    
);
и начал плясать от нее. Встал вопрос о внешнем ключе в следующей таблице:
Цитата Сообщение от AndrewNovi Посмотреть сообщение
CREATE TABLE all_fightings
(
    fightind_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    Name_event VARCHAR (256) NOT NULL,
    Fighter_1 VARCHAR (64) NOT NULL,
    Fighter_2 VARCHAR (64) NOT NULL,
    Winner VARCHAR (64) NOT NULL,
    Weight VARCHAR (64) NOT NULL,
    Method VARCHAR (64) NOT NULL,
    Stroke VARCHAR (64) NOT NULL,
    Round VARCHAR (64) NOT NULL,
    TIME VARCHAR (64) NOT NULL    
)
Понял, что им должен выступать
Цитата Сообщение от AndrewNovi Посмотреть сообщение
ALTER TABLE all_fighting ADD all_events_id INT NOT NULL;
ALTER TABLE all_fighting
ADD FOREIGN KEY (all_events_id) REFERENCES all_events(event_id) ON DELETE CASCADE;
но без значений он бесполезен. Данных очень много, и чтобы не переписывать парсер или писать дополнительный скрипт, я понадеялся что есть метод, который позволит автоматически определять значение внешнего ключа, ссылаясь например на другие данные которые есть, как в родительской так и дочерней таблице.
Вопросы: Есть такой метод, или мне придется изначально задавать значения внешнего ключа, а потом привязывать его к родительской таблице через
SQL
1
2
LTER TABLE all_fighting 
ADD FOREIGN KEY (all_events_id) REFERENCES all_events(event_id) ON DELETE CASCADE;
?

Добавлено через 2 минуты
Может вообще связваться с ключами была плохая идея, и эти таблицы можно связать по другому?
0
625 / 267 / 116
Регистрация: 12.04.2022
Сообщений: 958
22.06.2022, 13:37 6
Лучший ответ Сообщение было отмечено AndrewNovi как решение

Решение

Цитата Сообщение от AndrewNovi Посмотреть сообщение
Может вообще связваться с ключами была плохая идея
Вы делаете всё правильно.

Цитата Сообщение от AndrewNovi Посмотреть сообщение
и эти таблицы можно связать по другому?
Да, можно, например использовать естественный PK из таблички all_events.

Тогда, DDL изменится на:

SQL
1
2
3
4
5
6
7
8
9
CREATE TABLE all_events
(
    name_event VARCHAR (256) NOT NULL PRIMARY KEY,
    DATE VARCHAR (64) NOT NULL,
    location VARCHAR (128) NOT NULL    
);
 
ALTER TABLE all_fighting 
ADD FOREIGN KEY (name_event) REFERENCES all_events(name_event) ON DELETE CASCADE;
PS ON DELETE CASCADE - это для чего было сделано, что хотелось этим достичь?
1
0 / 0 / 0
Регистрация: 20.01.2021
Сообщений: 8
22.06.2022, 14:04  [ТС] 7
Цитата Сообщение от PaulWist Посмотреть сообщение
ON DELETE CASCADE
Скопировал с примера добавления внешнего ключа, и не стал удалять. Так понял, что он нужен в случае удаления данных из родительской таблицы. Решил, что не повредит)))

Хорошо, попробую поискать решение естественных ключах. Спасибо за совет.
0
4217 / 3058 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
22.06.2022, 14:36 8
Цитата Сообщение от AndrewNovi Посмотреть сообщение
Так понял, что он нужен в случае удаления данных из родительской таблицы
Для справки. БД вполне может функционировать без FK вообще. Лично я, добавляя новую таблицу, сначала не создаю FK, поскольку там могут быть свои сложности. И только после того, как процедуры, работающие с этой таблицей, отлажены, создаю FK. Поскольку целостность данных можно поддерживать не только с пом. FK, но и с пом. приложения или триггеров.
0
625 / 267 / 116
Регистрация: 12.04.2022
Сообщений: 958
22.06.2022, 16:25 9
Цитата Сообщение от AndrewNovi Посмотреть сообщение
Так понял, что он нужен в случае удаления данных из родительской таблицы. Решил, что не повредит)))
Повредит ещё как, такое удаление приведёт к тому, что удалив запись из справочника all_events удалятся все связанные по FK записи из all_fighting.

Добавлено через 1 час 27 минут
Цитата Сообщение от Grossmeister Посмотреть сообщение
Поскольку целостность данных можно поддерживать не только с пом. FK, но и с пом. приложения или триггеров.
Это до тех пор пока прилож. - это единственная прога имеющая доступ к БД.

Вообщем, не надо целостность в БД поддерживать через приложение, потом будет очень больно
0
4217 / 3058 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
22.06.2022, 16:44 10
Цитата Сообщение от PaulWist Посмотреть сообщение
потом будет очень больно
Хех... У Oracle есть такая ERP-система, OeBS называется. Там вообще мало FK, а в большинстве случаев целостность поддерживается как раз через приложения (для справки - в максимальной конфигурации 10000 таблиц). А вроде авторитетная контора...
0
625 / 267 / 116
Регистрация: 12.04.2022
Сообщений: 958
23.06.2022, 08:16 11
Цитата Сообщение от Grossmeister Посмотреть сообщение
У Oracle есть такая ERP-система, OeBS называется
Дык, вроде уже написАл:

Цитата Сообщение от PaulWist Посмотреть сообщение
Это до тех пор пока прилож. - это единственная прога имеющая доступ к БД.
+ если эта прога предоставляет свой API для доступа к данным.

Так же, архитектура проектирования вынуждает разработчика упрощать БД до уровня "таблиц/файлов dbf".
0
 Аватар для pincet
1652 / 1151 / 173
Регистрация: 23.07.2010
Сообщений: 6,859
23.06.2022, 11:19 12
Цитата Сообщение от PaulWist Посмотреть сообщение
+ если эта прога предоставляет свой API для доступа к данным.
это уже другой совсем вопрос распределенный доступ. тут рили нужен дополнительный слой
0
625 / 267 / 116
Регистрация: 12.04.2022
Сообщений: 958
23.06.2022, 11:30 13
Цитата Сообщение от pincet Посмотреть сообщение
это уже другой совсем вопрос распределенный доступ. тут рили нужен дополнительный слой
Не понял, причем тут распределенный доступ?

Речь идёт о многопользовательском доступе (клиент-сервер, не важно как архитектурно решенный), который по определению использует промежуточный слой (не путать с N-Tier Architecture) в виде ODBC/DB Provider.
0
23.06.2022, 11:30
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.06.2022, 11:30
Помогаю со студенческими работами здесь

Может ли первичный ключ одновременно являться внешним ключом?
люди, контрольная работа идет, подскажите ответ: может ли первичный ключ одновременно являться...

Получение данных из нескольких таблиц с составным внешним ключом
Добрый день, коллеги. Возник вопрос: у меня есть несколько таблиц, скриншот прилагаю. Остальные...

Ошибка #150 при создании таблицы с внешним ключом
Всем доброго времени суток, в чём проблема, уже битый час не могу понять, 1 таблица создаётся, но...

Поле со списком для работы с внешним ключом + фильтрация по значению
Всем привет!) Есть интересная задачка, касается она как написано в заголовке поля со списком. ...

Обработка заказа с внешним ключом
Прорабатываю нечто похожее на https://professorweb.ru/my/ASP_NET/gamestore/level2/2_7.php Однако...

Заполнение таблицы с внешним ключом
Добрый день. Имею следующие таблицы: (фото 1) И имею запрос на сохранение в таблицу basket: try...

Добавление в таблицы объединенные внешним ключом
Пожалуйста, скажите, что не так???????


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Как обучить нейросеть создания картинок на Python
bytestream 24.01.2025
В эпоху цифровых технологий искусственный интеллект становится неотъемлемой частью творческого процесса. Особое место в этой области занимает разработка и обучение нейронных сетей для создания. . .
Как обучить нейросеть генерации текста на Python
bytestream 24.01.2025
В современном мире искусственный интеллект и машинное обучение становятся неотъемлемой частью многих технологических решений. Одной из наиболее интересных и востребованных задач в этой области. . .
Машинное обучение на Python
bytestream 24.01.2025
Введение в машинное обучение на Python Машинное обучение представляет собой одну из наиболее динамично развивающихся областей информационных технологий, которая позволяет компьютерным системам. . .
Как удалить вирус-майнер с компьютера
hw_wired 24.01.2025
Вирусы-майнеры стали одной из наиболее серьезных угроз для пользователей компьютеров. Эти вредоносные программы тайно используют вычислительные ресурсы зараженного устройства для добычи криптовалюты. . .
Что такое веб-сервер, для чего он нужен и как работает
bytestream 24.01.2025
В современную эпоху цифровых технологий веб-сервер является фундаментальным компонентом интернет-инфраструктуры, обеспечивающим функционирование множества онлайн-сервисов и веб-сайтов. Этот. . .
Как в цикле for перебрать все элементы в словаре в Python
bytestream 24.01.2025
Словари в Python представляют собой мощные структуры данных, которые позволяют хранить информацию в формате ключ-значение. Эта особенность делает их незаменимыми при работе с данными, где требуется. . .
Как отменить rebase в Git
hw_wired 24.01.2025
Git rebase представляет собой мощный инструмент для управления историей коммитов в системе контроля версий Git. Этот механизм позволяет разработчикам изменять последовательность, комбинировать или. . .
Как поменять цвет input placeholder с помощью CSS
bytestream 24.01.2025
В веб-разработке оформление элементов пользовательского интерфейса играет ключевую роль в создании привлекательного и интуитивно понятного дизайна. Особое внимание уделяется формам ввода данных, где. . .
Как перебрать все значения в перечислении (enum) в C#
bytestream 24.01.2025
Перечисление (enum) в языке программирования C# представляет собой специальный тип данных, который позволяет определить набор именованных констант. Этот мощный инструмент особенно полезен, когда. . .
Как обойтись без проверки на null, чтобы избежать NullPointerExce­ption в Java
bytestream 24.01.2025
NullPointerException (NPE) является одним из самых распространенных исключений в Java, создающих серьезные проблемы при разработке программного обеспечения. Данное исключение возникает при попытке. . .
Что лучше использовать в href ссылок в JavaScript: "#" или "javascript:voi­­d(0)­"
bytestream 24.01.2025
При разработке веб-приложений важную роль играет правильное использование HTML-ссылок в сочетании с JavaScript. Одним из ключевых аспектов является выбор корректного значения атрибута href для. . .
Как узнать индекс элемента списка по его значению в Python
hw_wired 24.01.2025
При работе с коллекциями данных в Python часто возникает необходимость не только манипулировать элементами списка, но и определять их точное местоположение. Индекс элемента представляет собой. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru