从不同的表格中删除了特定ID

时间:2019-01-09 08:18:56

标签: sql mimer-sql

我想从不同的表中删除特定的ID,以删除这些值。

我的格式化问题是这样的:

  

地震!加利福尼亚沉入大海,我们在加利福尼亚的所有供应商在水下消失了。编写查询以从数据库中删除它们。如果声明了外键,那么在运行查询时会发生什么?如果您没有声明外键会怎样?

问题是我真的不知道如何处理

我希望它删除ID为“ California”的所有列。其中之一是,多次提到加利福尼亚州时使用了不同的ID,因为与加利福尼亚州不同的城市(例如“洛杉矶”和“旧金山”)

编辑:

包含城市/州的表

Table Supplier with columns city and state

Table Item with column Supplier(Id of table Supplier)

1 个答案:

答案 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命令,它将自动删除外键表中的所有相关行。