【问题标题】:how can I delete a row in Sqlite with foreign key?如何使用外键删除 Sqlite 中的一行?
【发布时间】:2021-06-14 21:44:57
【问题描述】:

我在尝试从我的数据库中删除一行时遇到问题... 数据库看起来像这样:
[数据库图片]

我想删除一个用户,所以我尝试了:

DELETE FROM USERS WHERE ID = 201;

但显然它根本不起作用,因为它与其他 TABLES 连接。 而且我不能使用 DROP 因为它的 sqlite。 我上网查了一下,一无所获……

错误: the error

【问题讨论】:

  • 查找“级联外键引用”。然后你需要决定你想做什么。 错误的事情是删除该行并让其他表引用不存在的行。
  • 我只想删除 1 个值。我有一个用户列表,我只想删除 id = 201。我已经查过了,并没有太大帮助......
  • 那么引用该用户的行呢?
  • 什么意思?我只想删除 1 个用户,仅此而已...我正在查看 sql 代码
  • 查看表格Albums(例如)。它有一个字段USER_ID(外键),我假设它是指拥有专辑的用户。这意味着您无法删除拥有子记录的用户,直到您删除了它的所有子记录。 @GordonLinoff 说查找“级联外键引用”

标签: c++ sql sqlite


【解决方案1】:

您的表名是用户,您在命令中使用了用户。它会给你错误,因为它应该与表名相同。

DELETE FROM Users WHERE ID = 201; 

【讨论】:

    【解决方案2】:

    假设您有另一个表将user_id 定义为外键:

    create table another (
        another_id int,
        user_id int,
        foreign key (user_id) references users(user_id)
    );
    

    而你在这个表中有数据,比如:

    another_id    user_id
        1           200
        2           201
        3           201
    

    现在,您想从用户中删除 201。此表中的第 2 行和第 3 行会发生什么情况?有几种选择:

    1. 行的值保持不变。但这些值不再指向有效用户。
    2. 删除引用 201 的行。
    3. 这些行被设置为某个值,例如NULL 或默认值。

    默认行为没有外键约束是 (1)。你最终会得到悬空的引用。而且您的数据库缺乏关系完整性。这被认为是一件坏事。

    SQL 支持级联删除和更新外键引用(尽管并非所有数据库都支持这些)。它们分别实现了上面列表中的(2)和(3)。

    您还可以手动更改引用行,以便删除用户。目前尚不清楚您真正想要做什么,但这解释了为什么您不能只删除行以及 SQL 提供的解决此问题的工具。

    【讨论】:

    • 感谢您的评论!我希望第二个选项发生。我不知道该怎么办
    • @prayerShawl 。 . .您需要将外键定义为级联删除外键引用。我建议您首先查看文档:sqlite.org/foreignkeys.html。
    • 我试图从另一个表中删除,但它没有工作......它说同样的错误
    • @prayerShawl 。 . .这就是为什么这些被称为“级联”。您要从中删除的表又具有对它的引用。等等。你今天学到了很多东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    相关资源
    最近更新 更多