在开发Android应用程序的过程中,我注意到ON UPDATE CASCADE
字段更新时NULL
无效。但是,当字段为NON NULL
时,ON UPDATE CASCADE
的工作正常。
我在网上搜索但无法找到具体的答案。
我的类扩展了SQLiteOpenHelper
,我有覆盖onOpen
方法,我激活了外键约束。我不相信这是问题所在,因为它在更新NULL
字段时无法正常工作。
@Override
public void onOpen(@Nonnull final SQLiteDatabase db) {
super.onOpen(db);
if (!db.isReadOnly()) {
// Enable foreign key constraints
db.execSQL("PRAGMA foreign_keys=ON;");
}
}
我使用的架构是:
CREATE TABLE IF NOT EXIST users (
role_id INTEGER,
user_id NUMERIC,
username TEXT,
PRIMARY KEY(user_id)
)
CREATE TABLE IF NOT EXIST devices (
user_id NUMERIC,
device_id NUMERIC,
device_name TEXT,
PRIMARY KEY(device_id),
FOREIGN KEY(user_id) REFERENCES users(user_id)
ON UPDATE CASCADE
)
INSERT INTO users (role_id, user_id, username) VALUES (1, NULL, 'test')
INSERT INTO devices (user_id, devices, device_name) VALUES (NULL, NULL, 'test')
当我们现在更新此用户行并将NULL
替换为1时,更新未被级联到设备行。
答案 0 :(得分:0)
“chue x”回答:
在子表中使用NULL时,不认为它与父项相关。 NULL是一个特殊值,不适用于关系约束。因此,您可以在子级中插入行(使用NULL键),而父级中不包含任何行。强制与父关系的唯一方法是将子字段声明为不可为空。