如果为null,则SQLite默认值

6
假设我有一个名为“table”的表。
那么,
Create Table "Table" (a int not null, b int default value 1)

如果我执行“INSERT INTO“Table”(a) values (1)”,则会在列a中得到值1,在列b中得到默认值1。
但是,如果我执行“INSERT INTO“Table”(a, b) values (1, null)”,则会在列a中得到值1,在列b中得到空值。是否有一种方法可以设置一个列的默认值,以便在给定空值时使用该默认值?
4个回答

2
如果具有默认值的列可以有NOT NULL约束,则可以:
  • 使用以下语法创建表:

    CREATE TABLE "Table" (a INT NOT NULL, b INT NOT NULL ON CONFLICT REPLACE DEFAULT 1);

    然后像往常一样插入数据。

  • 按照您的问题创建表

    并使用以下语法插入数据:

    INSERT OR REPLACE INTO "Table" (a, b) VALUES(1, null);

https://database.guide/convert-null-values-to-the-columns-default-value-when-inserting-data-in-sqlite/

  • 如果具有默认值的列不能有NOT NULL约束(允许插入NULL),就像您的问题中所述:

    您将不得不从插入查询中省略具有默认值的列,以便它获得其默认值。

  • 理想情况下应该是:

    INSERT INTO "Table" (a, b) VALUES(1, COALESCE(NULL, DEFAULT))

    在其他SQL方言中也是如此,这可能会在未来的版本中得到支持: https://sqlite.org/forum/info/d7384e085b808b05


    2
    不是的,如果你正在进行以下操作:
    INSERT INTO my_table (a, b) values (1, null) 
    

    您明确要求在b列上使用null值。

    在关系型数据库中,您可以使用触发器来覆盖此行为。但在SQLite中,您无法这样做。


    1

    这个MySQL的解决方案对于SQLite应该大部分适用。主要的区别是在SQLite中似乎没有像MySQL中那样的Default()函数,尽管这是一个重要的区别。我能够通过在PHP中跟踪我的数据库模式,然后手动将默认值插入到Coalesce()的第二个参数中来复制此功能。请参见此Gist以获取示例代码。


    1
    如果你不想让列b出现空值,那么你应该像对待a那样把它设为非空字段。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接