This is a mobile optimized page that loads fast, if you want to load the real page, click this text.

Требуется подсказка по работе с базой данных

NΞITHΞR#0001

Начинающий специалист
Автор темы
2 Сен 2021
61
20
52
Вопрос заключается в следующем:

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


 

Jerry (ChatGPT)

AI-powered language model
VIP
helper
17 Окт 2023
942
1,176
5
Если вы хотите удалить пользователя и все связанные с ним записи в других таблицах, вам нужно использовать операторы SQL для удаления с каскадом. Вот пример:

Код:
DELETE FROM users
WHERE id = <id пользователя>;

Вместо <id пользователя> вы должны указать конкретный ID пользователя, которого вы хотите удалить. Затем, чтобы удалить все связанные записи из других таблиц, вы должны создать внешний ключ с опцией ON DELETE CASCADE. Например:

Код:
CREATE TABLE house_entity (
    id INT PRIMARY KEY,
    user_id INT,
    ...
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

Теперь, когда вы удалите пользователя из таблицы users, все связанные записи из таблицы house_entity также будут удалены автоматически.
 
Реакции: NΞITHΞR#0001

Inoi

/dev/null
VIP
15 Окт 2020
2,444
1,443
208
34
Не очень знаю как работает ON DELETE CASCADE, вроде есть очевидно самый простой способ - просто сначала почистить дочерние таблицы.
То есть ты сначала удаляешь записи с существующими айдишниками, проверяя есть ли такой юзер в основной таблице, а потом уже юзеров.

SQL:
DELETE FROM house_entity
WHERE id IN (SELECT id FROM users);

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

В любом случае если чатжпт правильно подсказала про ON DELETE CASCADE - в целом и заебись
 

NΞITHΞR#0001

Начинающий специалист
Автор темы
2 Сен 2021
61
20
52
Мне нужно удалить учетные записи из account entity, user_entity. Но когда я удалял в прошлый раз, то остальные таблицы, зависящие от id, не могли найти из за удаления, что логично. Еще есть другие таблицы где так же связаны все аккаунты.


Причем при попытке удалить данные в account то таблица отсылается к user и говорит, что ключ настроен на бездействие: ON DELETE NO ACTION ON UPDATE NO ACTION)
 

NΞITHΞR#0001

Начинающий специалист
Автор темы
2 Сен 2021
61
20
52
Все сложно и я не могу догадаться как это сделать
 

Inoi

/dev/null
VIP
15 Окт 2020
2,444
1,443
208
34
А почему ты не хочешь очистить просто все таблицы?
Тебе нужно удалить не все аккаунты?
 

NΞITHΞR#0001

Начинающий специалист
Автор темы
2 Сен 2021
61
20
52
Так даже, если я удалю все аккаунты, мне нужно чтоб связанные с ними id в других таблицах так же были удалены

Но и прикол в том, что дошло до того, что я удалил все прописанные дома в house, так как:


А дома соответственно мне нужно оставить
 

Dmitry_V

Начинающий специалист
23 Июн 2023
781
168
62
26
Дай, угадаю оникс?
 

akudinov28

Гуру
24 Фев 2021
261
118
105
Чат ЖПТ дал действительно рабочий способ. Когда ты создаешь таблицу, записи в которой связаны с записями в другой таблице, ты создаешь ключ (foreign_key). При создании ключа можно задать действие, которое будет выполняться при удалении исходной записи, с которой строится связь. Например, у тебя имеется таблица accounts, и имеется таблица characters, которая связана с таблицей accounts посредством ключа user_id. Что нужно сделать:

Шаг первый: удаляем старый ключ.
Код:
ALTER TABLE `characters` DROP FOREIGN KEY `user_id`;

Шаг второй: создаем новый ключ и задаем действие при удалении.
Код:
ALTER TABLE `characters` ADD CONSTRAINT `user_id` FOREIGN KEY (`user_id`) REFERENCES `accounts` (`id`) ON DELETE CASCADE;

Эти шаги нужно повторить со всеми таблицами, записи в которых связаны с записями в таблице accounts. При выполнении вышеописанных действий при удалении записи из таблицы accounts также будут автоматически удалены все записи в связанных таблицах, поле user_id которых равно id удаленного пользователя.

P.S. Обратите внимание, что указанные выше действия автоматически обнулят ключи во всех изменяемых таблицах. Соответственно, в вашей ситуации все занесенные в таблицу дома будут иметь владельца null. Такая же петрушка будет с остальными таблицами, что может потенциально привести к проблемам. Например, предмет в инвентаре вдруг перестанет кому-либо принадлежать.

P.P.S. Запросы примерные, писались с телефона, возможно содержат ошибки.


P.P.P.S. Строить связи в таблицах и не продумать действие при удалении - проектирование вышло из чата...
 
Последнее редактирование:
Реакции: NΞITHΞR#0001