LINUX.ORG.RU

SQLite удаление записи.


0

0

Не могу понять как в sqlite удалить запись по данным из другой таблице.
Пробовал так:

DELETE FROM groups, home, parents, students WHERE students.id_students = 8
AND parents.id_parents = students.parents_students
AND home.id_home = students.home_students
AND groups.link_students_groups = 8; 

Но как я понял нельзя удалять сразу из нескольких таблиц. Переделал запрос так:
DELETE FROM home WHERE home.id_home = students.home_students AND students.id_students = 8;
DELETE FROM goups WHERE groups.link_students_groups = 8;
DELETE FROM parents WHERE parents.id_parents = students.parents_students AND students.id_students = 8;
DELETE FROM students WHERE students.id_students = 8;

Но тоже не работает жалуется на students.home_students что не так то на этот раз?


А дает такая команда:

DELETE FROM home, students WHERE home.id_home = students.home_students AND students.id_students = 8;

Вроде как нужно перечислять обе базы, чтобы получилось объединение. По другому данные в столбцах students.home_students и students.id_students найдены не будут.

xintrea
()
Ответ на: комментарий от xintrea

Выдает: Ошибка: near ",": syntax error Unable to execute statement.

n4ela
() автор топика
Ответ на: комментарий от n4ela

Не знаю как насчёт отличий синтаксиса, но это что-то вроде

DELETE FROM home WHERE home.id_home = (SELECT students.home_students from students WHERE students.id_students = 8);

name_no ★★
()
Ответ на: комментарий от name_no

а вообще, если home содержит общий словарь, то удалять адрес оттуда не нужно. Если же каждый адрес привязан только к одному конкретному студенту, то нужно добавить в эту таблицу внешний ключ id_student и делать delete from home where id_student = 8. То же самое про parents.

Насчёт групп, кажется, тоже схема таблицы неправильная, только я её не совсем понял.

name_no ★★
()

Что-то я так смотрю, у тебя тут все ссылки наизнанку. Зависимые объекты должны сами указывать на ключевой объект, а у тебя во всех таблицах всё сделано наоборот. Даже название полей задом наперёд. Отсюда и проблемы. Смотри, например.

таблица группы (группа_id, факультет_id, название группы, специализация, код специализации)

таблица студенты (студент_id, группа_id, ФИО)

таблица предки (предки_id, студент_id, признак мать/отец, ФИО) - по две записи на студента

таблица адреса (адрес_id, студент_id, адрес)

и запросы на удаление студента:

delete from parents where student_id = 8; delete from address where student_id = 8; delete from students_where student_id = 8; insert into soldiers (student_name, student_last_name)

насколько сразу всё проще, а? Можно ж ещё и триггеров повесить и вообще удалять только из одной таблицы.

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

name_no ★★
()
Ответ на: комментарий от name_no

У меня в таблице студентов есть ссылки на id родителей(мать и отец находятся в одно записи) и на Дом(адрес, телефон и.т.д.) Возможности того что у студентов могут быть одни родители я не предусматривал, вроде тут все правильно.

А вот с группами я сделал так. В таблице студентов не каких ссылок на группу нету, в таблице групп есть ссылки ( links_students) которая ссылается на id студента. Вот несколько групп могу ссылаться на одно студента. Если взять выбрать все группы которые links_students = 1 получаются список всех групп в которых побывал студент, самая большая по id_groups - эта активная группа студента, а все остальное отображается как история групп.

n4ela
() автор топика
Ответ на: комментарий от n4ela

Ты не понял, что я имею в виду. Я имею в виду, что у тебя схема сделана через жопу, а не то, что можно сделать лучше. Нужно, чтобы атрибут ссылался на объект, а не объект на атрибут. Потому что ты можешь внезапно захотеть добавить новые атрибуты и тебе придётся портить объект. А если сделать как я сказал, то ты создашь новую таблицу с внешним ключом по студент_id и всё.

Предки и адрес - это атрибуты. И именно они должны хранить ссылку на объект, который они описывают - на студента. Чтоб ты мог взять любого предка и сразу сказать, чей он предок, а не лезть опрашивать студентов с вопросом «чей это предок?» Если ты так переделаешь - у тебя пропадут вопросы вроде того, которым ты открыл тему. Если ты свою поделку ещё никому не показывал - сразу переделывай схему.

name_no ★★
()
Ответ на: комментарий от name_no

Спасибо за совет, буду переделывать.
Получается что то что я сделал с таблицей groups( там links_students указывает на id студента), является как раз правильным вариантом.

n4ela
() автор топика

Как насчет нового поля «deleted»?

power
()
Ответ на: комментарий от n4ela

> Получается что то что я сделал с таблицей groups( там links_students указывает на id студента), является как раз правильным вариантом.

да, похоже

name_no ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.