【问题标题】:Confusion on delete in sqlsql中删除的困惑
【发布时间】:2012-03-08 14:44:13
【问题描述】:

我有一个相当基本/幼稚的问题。

如果我有 2 个相关的表,即一个具有另一个的外键。

Table ATable BTable B1-N 关系,因此有一个额外的列用于对应的 id 记录在Table A 作为外键。

如果我删除Table A 中的一个条目,这会自动删除Table B 中的相应条目(它具有已删除的 idx 作为外键)或 我必须以编程方式删除它吗?

这是否取决于数据库或表的创建方式?这个我不是很清楚。

【问题讨论】:

  • 您可能应该研究您正在使用的数据库的文档。这是基本功能,应该有据可查。

标签: java sql database database-design cascading-deletes


【解决方案1】:

这取决于表的创建方式。

ON DELETE CASCADE(以及其他)有一个选项可以删除与您要删除的行相关的条目。

以下是执行此操作的创建表脚本示例:

http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/com.ibm.sqls.doc/sqls292.htm

下面是关于级联以及外键约束如何发挥作用的更好解释:

http://en.wikipedia.org/wiki/Foreign_key

【讨论】:

    【解决方案2】:

    您可以使用ON DELETE CASCADE 标志作为外键,这将删除其主键被删除的外键行

    【讨论】:

      【解决方案3】:

      不,不会,在 Microsoft MSSQL 中,假设您的约束设置正确,您将收到引用约束错误:

      IF NOT EXISTS (SELECT name FROM dbo.sysobjects
              WHERE id = object_id(N'A') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
      BEGIN
          PRINT 'CREATING TABLE A';
          CREATE TABLE A (
                  aID BIGINT IDENTITY(1,1) NOT NULL
                          CONSTRAINT pk_aID
                          PRIMARY KEY CLUSTERED,
                  aText VARCHAR(250) NOT NULL
          );
      END
      GO
      
      IF NOT EXISTS (SELECT name FROM dbo.sysobjects
              WHERE id = object_id(N'B') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
      BEGIN
          PRINT 'CREATING TABLE B';
          CREATE TABLE B (
              bID BIGINT IDENTITY(1,1) NOT NULL
                      CONSTRAINT pk_bID
                      PRIMARY KEY CLUSTERED,
              aID BIGINT NOT NULL
                      CONSTRAINT fk_b_a_aID
                      REFERENCES A(aID)
          );
      END
      GO
      

      所以“以编程方式”你应该先从表 B 中删除,然后再从表 A 中删除。

      更新

      正如其他人所说,此功能可以更改。

      【讨论】:

      • 默认情况下,您是正确的,但有启用此行为的选项。
      • 哦,好吧,以前没用过那个行为,我用默认行为来保证数据的一致性,即:我想从错误的表中删除时出错:)
      • 级联确实确保了数据的一致性 :) 虽然确实如此,但它确实在幕后做了一些事情(黑魔法),使其有时更容易出错。
      【解决方案4】:

      你必须先在表B中删除,然后才能在表A中删除。

      在 Simple 中,当您删除表中的任何行时,Foriegn Key References 表中不应有任何数据。

      【讨论】:

      • 这是真的(技术上),但问题是关于自动删除子行。
      • 默认情况下,您是正确的,但有启用此行为的选项。
      • Jim 说这是一个基本问题。我给了他基本的事实。我认为他没有要求任何技术来克服这一点。
      • 我不得不不同意.... OP 说“这是否取决于数据库或表的创建方式?我不清楚这一点。”而“事实”是它完全取决于表的创建方式。
      猜你喜欢
      • 2016-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-21
      • 2015-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多