【问题标题】:Default Constraint causing an error默认约束导致错误
【发布时间】:2015-01-13 15:29:27
【问题描述】:

我有以下 SQL 来创建表,但第一个 CONSTRAINT 中的“DEFAULT”给了我一个错误:“默认约束只能存在于 CREATE 或 ALTER TABLE 语句中的列级别。”

我以前从未使用过默认值,因此我通过互联网研究对此进行了一些调查,但没有任何东西可以帮助我解决错误,甚至没有向我真正解释过。

CREATE TABLE [RuleEngine].[NCCIImportHistory](
                [NCCIImportHistoryID] [int] IDENTITY(1,1) NOT NULL,
                [StartTime] [datetimeoffset](7) NOT NULL,
                [EndTime] [datetimeoffset](7) NOT NULL,
                [CreatedOn] [datetimeoffset](7) NOT NULL,
                [CreatedBy_UserID] [int] NOT NULL,
CONSTRAINT [DF_NCCIImportHistory_CreatedOn]  DEFAULT (getutcdate()) FOR [CreatedOn],
CONSTRAINT [FK_NCCIImportHistory_User_CreatedBy] FOREIGN KEY([CreatedBy_UserID]) REFERENCES [Security].[User] ([UserID]),
CONSTRAINT [PK_NCCIImportHistoryID] PRIMARY KEY CLUSTERED ([NCCIImportHistoryID] ASC) 
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]) ON [PRIMARY]

【问题讨论】:

  • 请指定 dbms。 (这看起来不像 ANSI/ISO SQL...)顺便说一句,我猜你做了类似列名数据类型 DEFAULT 值...
  • 对不起。它是 MS SQL Server

标签: sql sql-server tsql constraints default


【解决方案1】:

您没有指定您使用的数据库,但根据语法我认为它是 MS SQL Server。如果是这样,您可以将约束内联添加为列定义的一部分,如下所示:

[CreatedOn] [datetimeoffset](7) NOT NULL CONSTRAINT [DF_NCCIImportHistory_CreatedOn] DEFAULT (getutcdate()),

【讨论】:

  • 谢谢!那行得通!只要 StackOverflow 允许,我就会接受你的回答。
【解决方案2】:

试试这个

CREATE TABLE [RuleEngine].[NCCIImportHistory]
    (
      [NCCIImportHistoryID] [INT] IDENTITY(1, 1)
                                  NOT NULL ,
      [StartTime] [DATETIMEOFFSET](7) NOT NULL ,
      [EndTime] [DATETIMEOFFSET](7) NOT NULL ,
      [CreatedOn] [DATETIMEOFFSET](7) NOT NULL CONSTRAINT [DF_NCCIImportHistory_CreatedOn] DEFAULT ( GETUTCDATE() ),
      [CreatedBy_UserID] [INT] NOT NULL ,
      CONSTRAINT [FK_NCCIImportHistory_User_CreatedBy] FOREIGN KEY ( [CreatedBy_UserID] ) REFERENCES [Security].[User] ( [UserID] ) ,
      CONSTRAINT [PK_NCCIImportHistoryID] PRIMARY KEY CLUSTERED
        ( [NCCIImportHistoryID] ASC )

        WITH ( PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
               IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
               ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90 ) ON [PRIMARY]
    )
ON  [PRIMARY]

或先创建表,然后像这样的约束

CREATE TABLE [RuleEngine].[NCCIImportHistory]
    (
      [NCCIImportHistoryID] [INT] IDENTITY(1, 1) NOT NULL ,
      [StartTime] [DATETIMEOFFSET](7) NOT NULL ,
      [EndTime] [DATETIMEOFFSET](7) NOT NULL ,
      [CreatedOn] [DATETIMEOFFSET](7) NOT NULL,
      [CreatedBy_UserID] [INT] NOT NULL 
    )
ON  [PRIMARY]
GO


ALTER TABLE  [RuleEngine].[NCCIImportHistory] ADD CONSTRAINT [DF_NCCIImportHistory_CreatedOn] DEFAULT( GETUTCDATE() ) FOR [CreatedOn]
GO

ALTER TABLE  [RuleEngine].[NCCIImportHistory] ADD CONSTRAINT [FK_NCCIImportHistory_User_CreatedBy]  FOREIGN KEY ( [CreatedBy_UserID] ) REFERENCES [Security].[User] ( [UserID] )
GO

ALTER TABLE  [RuleEngine].[NCCIImportHistory] ADD CONSTRAINT [PK_NCCIImportHistoryID] PRIMARY KEY CLUSTERED( [NCCIImportHistoryID] ASC ) WITH ( PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
               IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
               ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90 ) ON [PRIMARY]
GO

【讨论】:

  • 我最初在那里有 ALTER,但我的导师建议将它们取出,所以这就是我按照我在问题中发布的方式进行操作的原因。不过谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 2012-06-18
相关资源
最近更新 更多