**已关闭。**此问题为not reproducible or was caused by typos。当前不接受答案。
这个问题是由打字错误或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
2天前关闭。
Improve this question
create_table = """
CREATE TABLE IF NOT EXISTS contacts(
name TEXT NOT NULL,
phone_no1 TEXT,
phone_no2 TEXT,
CHECK ((phone_no1 IS NOT NULL OR phone_no2 IS NOT NULL)
AND NOT (phone_no1 IS NULL AND phone_no2 IS NULL))
);
"""
conn.executescript(create_table)
conn.execute("INSERT INTO contacts VALUES (?,?,?);", ("Deepak Shetter", "1234567890", "9876543210"))
我是SQLite的初学者,我正在尝试添加约束以避免phone_no1
和phone_no2
都被设置为NULL
。(两者都可以为NULL)
当我执行下面的代码时
conn.execute("UPDATE contacts SET phone_no1=NULL WHERE phone_no1 = 1234567890;")
以及
conn.execute("UPDATE contacts SET phone_no1=NULL WHERE phone_no1 = 9876543210;")
它将两列都设置为NULL
。我应该如何更改CHECK约束以使其按预期工作?(我不确定问题是CHECK还是UPDATE)
谢谢你,
迪帕克·S
1条答案
按热度按时间olmpazwi1#
我相信您的CHECK约束,如图所示,而不是问题与您测试它所用的数据有关。
第一次更新会将phone_no1值设置为空。但是,第二次更新不会更新任何内容,因为phone_no1不等于9876543210。
但是,如果改为使用
UPDATE contacts SET phone_no2=NULL WHERE phone_no2 = 9876543210;
,则会发生CHECK约束冲突。例如使用:-
结果:-
即,如上所述,第二次更新不更新任何内容,第三次更新具有冲突。
如果两列都为空值,请考虑
SELECT sql FROM sqlite_master WHERE name = 'contacts';
PRAGMA ignore_check_constraints=off;
(尽管默认情况下此选项是关闭的,因此不太可能打开)