【问题标题】:How to insert default values in SQL table?如何在 SQL 表中插入默认值?
【发布时间】:2012-02-05 08:02:34
【问题描述】:

我有一张这样的桌子:

create table1 (field1 int,
               field2 int default 5557,
               field3 int default 1337, 
               field4 int default 1337)

我想插入一个具有 field2 和 field4 的默认值的行。

我试过insert into table1 values (5,null,10,null),但它不起作用,ISNULL(field2,default) 也不起作用。

当我插入一行时,如何告诉数据库使用该列的默认值?

【问题讨论】:

  • 另请参阅this question,了解 all 列具有默认值的情况。
  • 请不要在未定义如何的情况下发布“不起作用”。

标签: tsql insert default


【解决方案1】:

最好的做法是列出您的列,这样您就可以独立于表更改(新列或列顺序等)

insert into table1 (field1, field3)  values (5,10)

但是,如果您不想这样做,请使用 DEFAULT 关键字

insert into table1 values (5, DEFAULT, 10, DEFAULT)

【讨论】:

  • 太棒了!这正是我一直在寻找的。注意:您还可以指定列和值,传递 DEFAULT 而不是 NULL,如果存在 DEFAULT 约束,您将获得默认值,如果列可为空且未指定默认约束,则为 NULL。
  • 这个 确实 工作,但是当我尝试使用 (CASE WHEN This = That THEN 'SpecifiedValue' ELSE DEFAULT END) 时,它不起作用,这让我很懊恼。我仍然必须准备多个插入语句来覆盖我的所有场景,或者使用动态 SQL。 :(
  • 由于某种原因,我无法使用 SQLite 的 DB Browser 进行这项工作。一直抱怨DEFAULT 周围的语法错误。我必须像上面的例子一样指定非默认列,然后只为这些列提供值,然后它终于起作用了。
  • official documentation 对此只字未提。使用DEFAULT 安全吗? (如果没有文档,我们不能在未来版本的 sqlite3 中省略该功能时投诉,恕不另行通知。)
  • @ynn 另外,Using SQLite (p.326) 一书说“没有办法指定默认值,除非将列从列列表中删除,或者知道默认值是什么并显式插入它。".
【解决方案2】:

只是不要在插入语句中包含要使用默认值的列。例如:

INSERT INTO table1 (field1, field3) VALUES (5, 10);

...将为field2field4 采用默认值,并将5 分配给field1,将10 分配给field3

【讨论】:

  • 如果列没有定义默认值并且也设置为“NOT ALLOW NULLS”怎么办?
  • @binki 也许我应该改写我的评论:“aroth:你的答案不完整,因为当列没有定义默认值并且也设置为'NOT ALLOW NULLS'时可能出现异常”
  • @Danon - OP 声明“我想插入一个具有 field2 和 field4 的默认值的行”并询问“我如何告诉数据库在我使用该列的默认值时插入一行?”。你是对的,这个答案没有涵盖默认值没有定义的情况,但是由于问题明确没有询问这种情况,它并不准确将答案描述为不完整。你在谈论一个完全不同的问题(最好作为一个单独的问题提出)。
【解决方案3】:

如果所有列都有关联的默认值并且不想指定列名,则此方法有效:

insert into your_table
default values

【讨论】:

    【解决方案4】:

    这样试试

    INSERT INTO table1 (field1, field3) VALUES (5,10)
    

    那么 field2 和 field4 应该有默认值。

    【讨论】:

      【解决方案5】:

      如果您的列不应包含NULL 值,则还需要将列定义为NOT NULL,否则将使用传入的NULL 而不是默认值,并且不会产生错误。

      如果您没有将 any 值传递给这些字段(这需要您指定您确实要使用的字段),则将使用默认值:

      INSERT INTO 
        table1 (field1, field3) 
      VALUES   (5,10)
      

      【讨论】:

        【解决方案6】:

        你可以这样写

        GO
        ALTER TABLE Table_name  ADD
        column_name decimal(18, 2) NOT NULL CONSTRAINT Constant_name DEFAULT 0
        GO
        ALTER TABLE Table_name SET (LOCK_ESCALATION = TABLE)
        GO
        COMMIT
        

        【讨论】:

          【解决方案7】:

          我有一个案例,我有一个非常简单的表,我基本上只是想要一个只有默认值的额外行。不确定是否有更漂亮的方法,但这里有一种方法:

          这会将新行中的每一列设置为其默认值:

          INSERT INTO your_table VALUES ()
          

          注意:这对 MySQL 特别有用 INSERT INTO your_table DEFAULT VALUES 不起作用。

          【讨论】:

            【解决方案8】:

            要插入默认值,您应该像这样省略它们:

            Insert into Table (Field2) values(5)
            

            如果已定义,所有其他字段将具有 null 或其默认值。

            【讨论】:

              【解决方案9】:
              CREATE TABLE #dum (id int identity(1,1) primary key, def int NOT NULL default(5), name varchar(25))
              
              -- this works
              INSERT #dum (def, name) VALUES (DEFAULT, 'jeff')
              
              SELECT * FROM #dum;
              
              DECLARE @some int 
              
              -- this *doesn't* work and I think it should
              INSERT #dum (def, name)
              VALUES (ISNULL(@some, DEFAULT), 'george')
              
              SELECT * FROM #dum;
              

              【讨论】:

                【解决方案10】:
                CREATE PROC SP_EMPLOYEE                             --By Using TYPE parameter and CASE  in Stored procedure
                (@TYPE INT)
                AS
                BEGIN
                IF @TYPE=1
                BEGIN
                SELECT DESIGID,DESIGNAME FROM GP_DESIGNATION
                END
                IF @TYPE=2
                BEGIN
                SELECT ID,NAME,DESIGNAME,
                case D.ISACTIVE when 'Y' then 'ISACTIVE' when 'N' then 'INACTIVE' else 'not' end as ACTIVE
                 FROM GP_EMPLOYEEDETAILS ED 
                  JOIN  GP_DESIGNATION D ON ED.DESIGNATION=D.DESIGID
                END
                END
                

                【讨论】:

                • 我不认为这是一个答案。
                猜你喜欢
                • 1970-01-01
                • 2018-03-21
                • 2015-11-11
                • 2019-05-02
                • 2021-11-20
                • 2013-08-17
                • 2020-04-22
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多