有时候,我们可能会遇到某些实体需要非空引用同样实体的情况。something实体需要引用另一个非空的something实体。
表的定义:
CREATE TABLE somthing(
sid INTEGER PRIMARY KEY,
oid INTEGER REFERENCES somthing(sid) DEFERRABLE INITIALLY DEFERRED NOT NULL
);
例如,有AB两个sonething:
sid | oid |
---|---|
0 | 1 |
1 | 0 |
这时要插入id为0数据的时候,由于id为1的数据还没插入,数据库会报出没有相应引用的错误,插入失败,这时候我们可以采用延迟检查的方法,实现正确插入:
CREATE TABLE somthing(
sid INTEGER PRIMARY KEY,
oid INTEGER REFERENCES somthing(sid) DEFERRABLE INITIALLY DEFERRED NOT NULL
);
BEGIN TRANSACTION;
set constraints all deferred;
INSERT INTO somthing(sid, oid) VALUES(0, 1);
INSERT INTO somthing(sid, oid) VALUES(1, 0);
COMMIT