修改受外键约束的行

  • 本文关键字:约束 修改 sqlite
  • 更新时间 :
  • 英文 :


我有一个包含整数列的表,如下所示。bexParentID和bexParent TypeID列的目的是将外键约束到同一表中的其他行,即(bexParentID,bexParentTypeID)对同一表的(bexID,bexTypeID)具有复合FK约束。

这是创建脚本:

CREATE TABLE [main].[Boolean_Expressions](
[bexID] INTEGER PRIMARY KEY NOT NULL, 
[bexTypeID] INTEGER NOT NULL, 
[bexParentID] INTEGER NOT NULL, 
[bexParentTypeID] INTEGER NOT NULL, 
FOREIGN KEY([bexParentID], [bexParentTypeID]) REFERENCES [Boolean_Expressions]([bexID], [bexTypeID]),
UNIQUE([bexID], [bexTypeID]);

表格设计

以下是此表中可能出现的数据示例。数据

如何更新具有来自行B、C、D…的外键约束的行(称为a(的类型?更新B、C、D…行的ParentType是违规的,首先更新a中的Type也是违规的。

我只能通过更改ParentID和ParentType以指向完全不同的行(称之为X(,然后更改A的Type,然后将B、C、D…"指向"另一行。

ON UPDATE CASCADE添加到FK约束:

FOREIGN KEY([bexParentID], [bexParentTypeID]) REFERENCES [Boolean_Expressions]([bexID], [bexTypeID]) ON UPDATE CASCADE

效果:更新父行即可;所有从属子行都将更新为具有相同的值。

两个可能更简单的选项。

a( 在更新前关闭外键,然后在更新后打开外键。使用"PRAGMA foreign_keys=关闭"one_answers"PRAGA foreign_keys=打开">

  • = false(关闭(或= true(打开(或= 0(关闭(或者= 1(打开((任何大于0的值都是打开的(

  • note不能在事务中有效使用(也就是NOP(。

例如

PRAGMA foreign_keys = off;
UPDATE ....;
PRAGMA foreign_keys = on;

b( 使用延期外键,包括:-

DEFERRABLE INITIALLY DEFERRED

在外键定义中。

例如

bexParentID INTEGER NOT NULL REFERENCES mytable1(bexID) DEFERRABLE INITIALLY DEFERRED 

提交事务时会检查外键冲突。因此,这些更改需要在事务内部完成。例如

BEGIN TRASNACTION;
UPDATE ....;
END TRANSACTION;

最新更新