我想从不同的表中删除特定的ID,以删除这些值。
我的格式化问题是这样的:
地震!加利福尼亚沉入大海,我们在加利福尼亚的所有供应商在水下消失了。编写查询以从数据库中删除它们。如果声明了外键,那么在运行查询时会发生什么?如果您没有声明外键会怎样?
问题是我真的不知道如何处理
我希望它删除ID为“ California”的所有列。其中之一是,多次提到加利福尼亚州时使用了不同的ID,因为与加利福尼亚州不同的城市(例如“洛杉矶”和“旧金山”)
编辑:
包含城市/州的表
Table Supplier with columns city and state
Table Item with column Supplier(Id of table Supplier)
答案 0 :(得分:2)
假定您未启用级联删除,那么必须首先从“项目”表中删除与加利福尼亚供应商有关的所有行。如果您尝试首先删除供应商,则def read(file, encoding: str = 'utf-8', errors: str = 'strict'):
"""
:param file: File Memory Object (submitted from POST)
:return: File Iterable object
"""
file = StringIO(file.read().decode(encoding=encoding, errors=errors))
return csv.DictReader(file, delimiter=',')
表中引用的任何供应商都将失败,因为这将违反外键约束。该约束可确保数据的完整性,并确保Item
表中的条目不能包含孤立的/不存在的供应商ID。
因此,如果“加利福尼亚”的州ID为20,则可以运行:
Item
然后
DELETE FROM Item where Supplier IN (SELECT ID FROM Supplier WHERE State = 20)
,它将删除所有链接回加利福尼亚供应商的项目行,然后是所有供应商。
当然,如果加利福尼亚不再存在,您可能也想DELETE FROM Supplier WHERE State = 20
。 (我在这里假设您有一个正确的规范化数据库,该数据库具有一个States表,而您确实应该有该表,而不是每次都在Supplier表中复制State描述)。
但是,如果要使用DELETE FROM States where ID = 20
来定义外键,即
“级联删除”,那么您可以直接对Suppliers表(甚至是States表,如果有的话)直接运行delete命令,它将自动删除外键表中的所有相关行。