更新表行时SQLite CHECK约束未按预期工作[已关闭]

rbpvctlc  于 2023-03-19  发布在  SQLite
关注(0)|答案(1)|浏览(150)

**已关闭。**此问题为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_no1phone_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

olmpazwi

olmpazwi1#

我相信您的CHECK约束,如图所示,而不是问题与您测试它所用的数据有关。
第一次更新会将phone_no1值设置为空。但是,第二次更新不会更新任何内容,因为phone_no1不等于9876543210。
但是,如果改为使用UPDATE contacts SET phone_no2=NULL WHERE phone_no2 = 9876543210;,则会发生CHECK约束冲突。
例如使用:-

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)
    )
);
INSERT INTO contacts VALUES('Deepak Shetter', '1234567890', '9876543210');
SELECT * FROM contacts;
UPDATE contacts SET phone_no1=NULL WHERE phone_no1 = 1234567890;
UPDATE contacts SET phone_no1=NULL WHERE phone_no1 = 9876543210;
UPDATE contacts SET phone_no2=NULL WHERE phone_no2 = 9876543210;
SELECT * FROM contacts;

结果:-

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)
    )
)
> OK
> Time: 0.049s

INSERT INTO contacts VALUES('Deepak Shetter', '1234567890', '9876543210')
> Affected rows: 1
> Time: 0.024s

SELECT * FROM contacts
> OK
> Time: 0s

UPDATE contacts SET phone_no1=NULL WHERE phone_no1 = 1234567890
> Affected rows: 1
> Time: 0.024s

UPDATE contacts SET phone_no1=NULL WHERE phone_no1 = 9876543210
> Affected rows: 0
> Time: 0s

UPDATE contacts SET phone_no2=NULL WHERE phone_no2 = 9876543210
> CHECK constraint failed: contacts
> Time: 0s

即,如上所述,第二次更新不更新任何内容,第三次更新具有冲突。
如果两列都为空值,请考虑

  • 检查已经应用了检查约束(即,在对定义的改变被改变之前该表不存在)。
  • 可能使用SELECT sql FROM sqlite_master WHERE name = 'contacts';
  • 使用PRAGMA ignore_check_constraints=off;(尽管默认情况下此选项是关闭的,因此不太可能打开)

相关问题