2011-05-26 58 views
0

我使用SQL Server 2008 R2 Express定义了一个数据库,并使用Visual Basic 2010 Express连接到它。由于某种原因,当我在程序中使用数据库时,它想要使用负主键开始。为什么VB 2010和SQL Server中的数据表以负的主键开始?

有什么办法让主键只有一个正数吗?

+2

发布您的表的DDL和用于写入它的代码,这将是一个很大的帮助,在回答你的问题。 – Tony 2011-05-26 00:08:17

+2

它为什么重要?如果您使用标识列作为主键,则您应该关心的是这些值是自动唯一的。 – 2011-05-26 04:30:11

回答

2

除了@RNarry年轻响应。如果你的表,你可以检查架构

假设你有如下表

create table #t 
(
    ID int Identity(-1, 1), 
    s varchar(100) 
) 

现在你让两个刀片

Insert into #t(s) values('ed') 
Insert into #t(s) values('ed') 

检查输出

select * from #t 

这表明像下面。如果你看到屏幕截图。 第一行在主键值中显示-1。由于架构中提到的身份种子为-1的原因。

enter image description here

你就可以摆脱这个问题。我们应该使用下面的模式。

create table #t 
    (
     ID int Identity(1, 1), 
     s varchar(100) 
    ) 

以下是其他的方式来产生

Set Identity_Insert #t On 
Insert into #t(ID, s) values(-1, 'ed') 
Set Identity_Insert #t OFF 

Set Identity_Insert #t On 
Insert into #t(ID, s) values(-2, 'ed') 
Set Identity_Insert #t OFF 
+0

我在Visual Basic中创建了表(连接到SQL Server Express)。我检查了身份规范,并将其设置为1的种子,并且增量为1.也许我不应该将数据类型设置为bigint? – 2011-05-26 15:28:10

+0

我想我想通了。在XSD文件中,在主键的属性中,它被设置为-1的种子。去确定XSD文件会忽略MDF设置。谢谢! – 2011-05-26 16:44:25

0

关闭的手,我只能想到两两件事,将导致此:

  1. 在创建表,你(或你正在使用一些软件/代码)被设置标识种子为负数。

  2. 或者,您(或您使用的是一些软件/代码)使用IDENTITY_INSERT,只是迫使负数。

0

该表的标识种子将是内SSMS可见。

但是......它丝毫不关心它产生负数。这里只有实际上是两个你identiity值实际问题:

  1. 唯一值
  2. 足够的空间来覆盖值的预期范围(所以,一个TINYINT密钥不会是很好的跟踪整个世界人口.. )

一旦它们被排序后,实际值根本不应该有任何顾虑。它们在数据库内部。

相关问题