代码之家  ›  专栏  ›  技术社区  ›  MatsT

SQL表中的创建日期列

  •  1
  • MatsT  · 技术社区  · 16 年前

    用创建行的日期自动填充sql数据表中的datetime列的最简单方法是什么?如果重要,请使用SQL Server 2005。

    编辑:我尝试使用getDate()作为默认值,这适用于插入查询,但在TableAdapter添加行时不适用。

    6 回复  |  直到 16 年前
        1
  •  5
  •   David M    16 年前
    ALTER TABLE table
    ADD column NOT NULL DEFAULT (GETDATE())
    
        2
  •  2
  •   paxdiablo    16 年前

    您应该创建列并具有:

    • 将其设置为当前日期(或日期/时间)的insert(after)触发器。
    • 不允许列更改的更新(而不是)触发器。

    任何默认值解决方案都是不安全的,因为在插入列或随后更改列时,可以通过专门设置列来绕过它。基于触发器的解决方案将控件与dbms放在其所属的位置。

        3
  •  1
  •   KM.    16 年前

    为其设置默认值:

    CREATE TABLE dbo.YourTable
        (
        columns....,
        YourDateTime datetime NOT NULL
        )  ON [PRIMARY]
    GO
    ALTER TABLE dbo.YourTable ADD CONSTRAINT
        DF_YourTable_YourDateTime DEFAULT GETDATE() FOR YourDateTime
    

    插入时不列出该列:

    INSERT INTO dbo.YourTable (columns...) VALUES (values...)
    

    或者在插入该列列表时,使用默认关键字:

    INSERT INTO dbo.YourTable (columns...,YourDateTime) VALUES (values...,DEFAULT)
    

    或者在插入该列并使用getDate()或其他日期时间时:

    INSERT INTO dbo.YourTable (columns...,YourDateTime) VALUES (values...,'1/1/2010 12:34:56')
    
        4
  •  1
  •   David Fox    16 年前

    使用 getdate() 函数,

    比如说: insert data1, data2, getdate() into table1

        5
  •  1
  •   Will Marcouiller    16 年前

    正如你所看到的,前面有多种解决方案。简而言之,

    1. 您可以编写方法(在vbnet中),将适当的字段设置为system.datetime.now(不是最佳实践);

      Public Function InsertObject(o As Object) As Integer
          cmd.CommandText = String.Format("INSERT INTO table_name (Id, CreationDate) VALUES (1, {0})", System.DateTime.Now)
          Return cmd.ExecuteNonQuery()
      End Function
      
    2. 您可以编写INSTEAD OF INSERT触发器,并将CREATIONDATE INSERTED值替换为getDate()(推荐的方式);

      CREATE TRIGGER trg_bi_PersistObject
      ON objectToPersistTable
      INSTEAD OF INSERT AS
          insert into objectToPersistTable (Id, CreationDate) (
              select Id, GETDATE()
                  from inserted
          )
      

      (请考虑一下,代码是在我的头顶上的。出于语法目的,可能需要一些修复程序。这至少给了你一个主要的想法。)

    3. 您可以设置一个默认值(但由于某些原因,它似乎不适合您)。

      (代码见david m或km的答案)。

    正如paxdiablo对自己的回答的评论所述,这种特性应该在dbms端处理,以避免应用程序客户端的数据损坏。那么,我敢打赌您最好的选择可能是2.创建一个before insert触发器,并用getdate()函数设置其中的值。

        6
  •  0
  •   Marcus Adams    16 年前

    如果使用复制,请小心。我不熟悉sql server复制的内部细节,但我知道,对于某些形式的mysql复制,如果使用now()作为默认值或使用相同函数使用触发器,发布服务器和订阅服务器数据库之间的日期会有所不同。

    如果在应用程序中设置了日期,则该日期始终可以复制。当然,需要注意的是,应该从应用程序(或web)服务器设置日期或时间,因为不能信任最终用户计算机上的日期和时间。

    如果您正在使用复制,则可能需要对此进行测试。

    推荐文章