Sql server 数据库创建过程中的标识问题
使用SQLServerManagementStudio,我的问题源于数据库创建脚本。编写脚本是为了创建数据库,其中许多表都有一个标识列:Sql server 数据库创建过程中的标识问题,sql-server,identity,database-create,Sql Server,Identity,Database Create,使用SQLServerManagementStudio,我的问题源于数据库创建脚本。编写脚本是为了创建数据库,其中许多表都有一个标识列: CREATE TABLE Workshop ( WorkshopID int IDENTITY, WorkshopName varchar(40) NOT NULL, Description varchar(800), CONSTRAINT PK_Workshop PRIMARY KEY (WorkshopID) ); 我的问
CREATE TABLE Workshop
(
WorkshopID int IDENTITY,
WorkshopName varchar(40) NOT NULL,
Description varchar(800),
CONSTRAINT PK_Workshop PRIMARY KEY (WorkshopID)
);
我的问题是,即使脚本简单地创建了一个列作为标识列,但在脚本运行之后,应该是标识列的列中没有一个实际将该列设置为标识列
澄清:运行上述代码将按照指定创建该表,除非WorkshopID不是标识列
需要更改哪些内容才能使脚本按编写的方式工作?仅供参考,如果您使用SQL Management Studio的设计器为此生成脚本,则生成的脚本如下:
/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Table_1
(
WorkshopID int NOT NULL IDENTITY (1, 1),
WorkshopName varchar(40) NOT NULL,
Description varchar(800) NULL
) ON [PRIMARY]
GO
ALTER TABLE dbo.Table_1 ADD CONSTRAINT
PK_Table_1 PRIMARY KEY CLUSTERED
(
WorkshopID
) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
ALTER TABLE dbo.Table_1 SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
如果您创建表,然后使用“创建到…”命令对其编写脚本。。。菜单选项您将获得完全不同的脚本:
USE [MyDatabase]
GO
/****** Object: Table [dbo].[Workshop] Script Date: 11/27/2012 14:05:33 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Workshop](
[WorkshopID] [int] IDENTITY(1,1) NOT NULL,
[WorkshopName] [varchar](40) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[Description] [varchar](800) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
CONSTRAINT [PK_Workshop] PRIMARY KEY CLUSTERED
(
[WorkshopID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
如何验证
WorkshopID
不是IDENTITY
列?在一个管理数据库的程序出现错误后,我进入SSMS,查看了表的设计,所有本应为IDENTITY列的列的列属性中的“(is IDENTITY)”设置为“否”。好的,您在SSMS中运行了脚本,并且在运行脚本之后(以及在运行程序或执行任何其他操作之前),您是否验证了表是在没有identity属性的情况下创建的,即使您的脚本要求这样做并且脚本成功运行?您确定它没有生成您忽略的错误,并且您在正在检查的数据库中运行它,并且程序在其中运行吗?我运行了您的脚本,它创建了具有identity属性的表,因此这里有一些信息没有对齐。@AaronBertrand我还通过刷新对象资源管理器,然后在看到Kelly描述的相同行为时打开表上的Design视图来检查标识。我想知道我们看到的是SSMS刷新中的间歇性错误,而不是表创建中的失败?@JamieSee我无法复制,也无法找到任何现有的错误。您正在使用哪个版本的Management Studio?您应用过任何service Pack吗?没有,不需要指定非空
,特别是当它通过主键强制执行时。虽然不是必需的,但我建议始终添加种子值和增量值创建表车间(WorkshopID int IDENTITY(1,1)非空,WorkshopName varchar(40)不为空,说明varchar(800),约束PK_车间主键(WorkshopID))
@Nic尽管如此,这些建议都没有解决实际问题。@AaronBertrand实际上NOT NULL是必需的,因为您将看到是否同时运行这两个脚本。在发布之前,我在SQL 2008 R2中正是这样做的。这可能是因为强制NOT NULL行为的约束的创建在初始创建后得到了处理?@JamieSee我不确定我是否理解你所说的是必要的。我能够使用问题中的脚本创建一个表,并且该表具有identity属性,它可以正常工作。我在任何时候都不需要说not NULL
。。。