【问题标题】:Is there something like "ON DELETE NULL"?有没有像“ON DELETE NULL”这样的东西?
【发布时间】:2016-05-12 13:47:56
【问题描述】:

我有两张桌子:

create table notes (
    _id integer primary key autoincrement,
    title text not null,
    body text not null,
    category text,
    foreign key(category) references categories(title) on delete null);

create table categories (
    _id integer primary key autoincrement,
    title text unique not null);

我想知道是否有类似 ON DELETE CASCADE 的东西,但不是删除内容,而是将其更改为 NULL

显然ON DELETE NULL 不起作用。

编辑:我通过使用触发器实现了这一点:

"create trigger trg_delete before delete " +
                "on categories " +
                "begin " +
                "update notes set category = null where category = old.title; " +
                "end";

【问题讨论】:

  • 是的,您可以使用 ON DELETE SET NULL .dev.mysql.com/doc/refman/5.7/en/ansi-diff-foreign-keys.html
  • @yasiriqbal776 它编译并且没有给出错误,但没有做任何事情:/
  • 这不起作用,因为您必须将类别列设置为空,否则根据外键规则它不能为空
  • @yasiriqbal776 我不明白,我必须从类别中设置什么为空?你能举个例子吗?请注意,我不太喜欢数据库
  • 创建表注释(_id整数主键自增,"+"标题文本不为空,正文不为空,类别文本默认为空,"+"外键(类别)引用类别(标题)删除设置默认值);试试这个查询我希望问题会得到解决:)

标签: android sqlite cascading-deletes


【解决方案1】:

您可以使用触发器来实现您的预​​期 在您的表上创建一个删除前触发器,并在该触发器中将 forien 键更新为 null

//example
CREATE TRIGGER trg_delete BEFORE Delete 
ON categories 
BEGIN
update  notes set categories=null  where categories = old._id;
END

听到link 了解有关触发器的更多信息

【讨论】:

  • 有没有办法在 Android 上做到这一点?
  • 是的,您可以在 android 中执行此操作,也可以在创建表后使用相同的查询来执行此操作
  • 您也可以使用 Sqlite 管理器并在那里自己尝试
【解决方案2】:

在 SQLite 中,该操作的拼写不是 ON DELETE NULL,而是ON DELETE SET NULL

create table notes (
    [...],
    foreign key(category) references categories(title) on delete set null);

【讨论】:

    猜你喜欢
    • 2011-05-03
    • 2013-07-30
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多