我有一个包含整数列的表,如下所示。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;