Как сделать так, чтобы удалялась строка, при этом одно поле принадлежит полю в другой таблице
У меня есть две таблицы groups и students. В таблице students поле group.id связано с group.id в таблице groups. При попытке удаления строки через идентификатор он выдает ошибку
def dels(self):
try:
ids = int(self.idp.text()) # идентификатор строки
except:
return
try:
self.cur.execute("delete from groups where id=%s",(ids,))
self.upd()
except:
print('Ошибкааа')
Значение, которое находится в student.group.id при этом переданное из таблицы groups.group.id , допустим 3 не может быть удалено, поскольку оно находится в таблице students. Другими словами я не могу удалить строку groups.group.id с значением 3, так как оно находится в students.group.id
Я бы хотел удалить строку по идентификатору в таблице groups, при этом сразу же чтобы подставлялось значение NULL в таблице students в поле students.group.id . Как это сделать?
Я пробовал писать сразу же UPDATE на NULL при удалении, но у меня это не сработало, да и в принципе все строки примут значение NULL, мне это не нужно, лишь конкретная строка.
UPDATE students SET group_id = NULL FROM (SELECT * FROM groups) AS groups WHERE groups.group_id = students.group.id
Ответы (2 шт):
Получилось сделать то, что я хотел в PostgreSql , теперь не обнуляет все строки, но это не работает в моей функции и все равно выдает ошибку, хотя в PostgreSql все хорошо работает, что не так в ней?
def dels(self):
try:
ids = int(self.idp.text()) # идентификатор строки
except:
return
try:
idk = int(self.group_id())
self.cur.execute("DO $do$ BEGIN IF EXISTS(SELECT * FROM students) THEN UPDATE students SET group_id = NULL FROM (SELECT * FROM groups) AS groups WHERE groups.group_id = students.group_id AND groups.group_id=%s; END IF; END $do$", (idk,))
self.upd()
except:
print('Не сработало')
try:
self.cur.execute("delete from groups where id=%s",(ids,))
self.upd()
except:
print('Ошибкааа')
Уже все решил теперь все работает
def dels(self):
try:
ids = int(self.idp.text()) # идентификатор строки
except:
return
try:
idk = int(self.group_id.text())
self.cur.execute("DO $do$ BEGIN IF EXISTS(SELECT * FROM students) THEN UPDATE students SET group_id = NULL FROM (SELECT * FROM groups) AS groups WHERE groups.group_id = students.group_id AND groups.group_id=%s; END IF; END $do$", (idk,))
self.upd()
except:
print(idk)
print('Не сработало')
try:
self.cur.execute("delete from groups where id=%s",(ids,))
self.upd()
except:
print('Ошибкааа')