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

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

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

Студворк — интернет-сервис помощи студентам
Добрый день!
Я работаю над своим проектом по спортивной аналитике. Решил перенести готовые таблицы 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 и addresses. В addresses есть поле id_user,...

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

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

12
408 / 242 / 88
Регистрация: 28.04.2022
Сообщений: 1,207
22.06.2022, 12:26
Цитата Сообщение от AndrewNovi Посмотреть сообщение
SQL должна ориентироваться на значение столбца Name_event из первой и второй таблицы, и на основании этого выдавать второй таблице соответствующий внещний ключ? Или что-то в этом духе?
Коллега, искусственный интеллект ещё не настолько проник в IT, как об этом трубят из всех утюгов.
У вас таблица all_fightings должна содержать ID записей из таблицы all_events. Сейчас этого нет.
Я не знаю вашу задачу, но могу предположить, что надо ещё подумать над архитектурой. Может что-то надо изменить.
1
0 / 0 / 0
Регистрация: 20.01.2021
Сообщений: 8
22.06.2022, 12:49  [ТС]
Нет, то что там не хватает столбца, я знаю. Я пытался его добавлять после созжания таблицы:
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
670 / 293 / 120
Регистрация: 12.04.2022
Сообщений: 1,002
22.06.2022, 12:56
Цитата Сообщение от AndrewNovi Посмотреть сообщение
Но пока ничего кроме как изначально задавать в csv таблице значения ключей, а не придумал...
Озвучьте задачу, которую пытаетесь решить.
0
0 / 0 / 0
Регистрация: 20.01.2021
Сообщений: 8
22.06.2022, 13:21  [ТС]
Я спарсил таблицы в виде 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
670 / 293 / 120
Регистрация: 12.04.2022
Сообщений: 1,002
22.06.2022, 13:37
Лучший ответ Сообщение было отмечено 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  [ТС]
Цитата Сообщение от PaulWist Посмотреть сообщение
ON DELETE CASCADE
Скопировал с примера добавления внешнего ключа, и не стал удалять. Так понял, что он нужен в случае удаления данных из родительской таблицы. Решил, что не повредит)))

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

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

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

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

Так же, архитектура проектирования вынуждает разработчика упрощать БД до уровня "таблиц/файлов dbf".
0
 Аватар для pincet
1655 / 1154 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
23.06.2022, 11:19
Цитата Сообщение от PaulWist Посмотреть сообщение
+ если эта прога предоставляет свой API для доступа к данным.
это уже другой совсем вопрос распределенный доступ. тут рили нужен дополнительный слой
0
670 / 293 / 120
Регистрация: 12.04.2022
Сообщений: 1,002
23.06.2022, 11:30
Цитата Сообщение от pincet Посмотреть сообщение
это уже другой совсем вопрос распределенный доступ. тут рили нужен дополнительный слой
Не понял, причем тут распределенный доступ?

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru