我是使用Microsoft SQL进行编程的新手,我正在尝试设计一个支持随时间存储数据的表,最终可用于绘制图形。我发现一篇文章(https://www.simple-talk.com/sql/database-administration/database-design-a-point-in-time-architecture/)似乎指向一种可以支持类似内容的设计。但是,当我尝试使用它时,CREATE TABLE上的测试代码似乎不起作用。
CREATE TABLE [dbo].[Test_PTA_Table](
[TestTablePK] [int] IDENTITY(1,1) NOT NULL,
[TestTableText] [varchar](50)
COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[DateCreated] [datetime]
NOT NULL CONSTRAINT [DF_Test_PTA_Table_DateCreated]
DEFAULT (getdate()),
[DateEffective] [datetime] NOT NULL,
[DateEnd] [datetime] NULL,
[OperatorCode] [varchar](50)
COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[DateReplaced] [datetime] NULL
CONSTRAINT [DF_Test_PTA_Table_DateReplaced]
DEFAULT (getdate()),
CONSTRAINT [PK_Test_PTA_Table] PRIMARY KEY CLUSTERED
(
[TestTablePK] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
这会在我的机器上抛出错误,说:
Msg 170, Level 15, State 1, Line 22
Line 22: Incorrect syntax near '('.
奇怪的是,一旦删除了有问题的代码行WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF)
,它就会起作用,所以我不确定这里发生了什么。当Create Table语法的文档在其帮助文件中支持时,为什么这行代码会导致问题?知道这个问题可能是一个缺少愚蠢的逗号或其他东西,但任何帮助将不胜感激。谢谢!
答案 0 :(得分:1)
语法有效,应该在SQL2008及更高版本上编译,但是,这样说,从脚本中删除这些选项是相对安全的。
关于他们的意思, PAD_INDEX
指定索引填充,默认值为OFF
。当它为ON
时,fillfactor指定的可用空间百分比将应用于索引的中间级页面,否则中间级页面将填充到接近容量的位置。通常,您不应将此值设置为{ {1}}除非您确切知道自己在做什么
关于ON
,当它为IGNORE_DUP_KEY
(默认值)时,重复键值会导致错误并回滚整个语句。也就是说,如果语句试图插入多行,则不会插入任何行,但是,当它设置为OFF
时,将忽略此错误,并插入其中一个重复行。由于此选项默认设置为ON
,因此您可以从脚本中安全地将其删除。