我目前正在开发Azure表存储的应用程序.在该应用程序中,我有一个表,它将具有相对较少的插入(几千/天),并且这些实体的主键将在另一个表中使用,该表将具有数十亿行.
因此,我正在寻找一种方法来使用自动递增的整数而不是GUID作为小表中的主键(因为它将节省大量存储和插入的可伸缩性并不是真正的问题).
关于这个主题已经有过一些讨论,例如http://social.msdn.microsoft.com/Forums/en/windowsazure/thread/6b7d1ece-301b-44f1-85ab-eeb274349797.
但是,由于并发问题可能很难调试和发现,我对自己实现这一点感到有点不舒服.因此,我的问题是,是否有一个经过充分测试的阻止?
concurrency primary-key auto-increment identity-column azure-storage
如何在SQL Server中将表的标识列重置为零?
编辑:
我们怎么能用LINQ to SQL做到这一点?
换句话说,以下"光标"方法是否有效:
LastMax"SELECT * FROM MyTable WHERE Id > {0}", LastMax为了使其工作,我必须确保我在步骤1中没有得到的每一行都有一个大于的Id LastMax.这是保证,还是我可以遇到奇怪的竞争条件?
有没有办法永久更改标识列的标识种子?使用DBCC CHECKIDENT似乎只是设置了last_value.如果表被截断,则重置所有值.
dbcc checkident ('__Test_SeedIdent', reseed, 1000)
select name, seed_value, increment_value, last_value
from sys.identity_columns
where [object_id] = OBJECT_ID('__Test_SeedIdent');
Run Code Online (Sandbox Code Playgroud)
回报
name seed_value increment_value last_value
-------------------------------------------------
idIdent 1 1 1000
Run Code Online (Sandbox Code Playgroud)
我希望有一些语法
alter table dbo.__Test_SeedIdent alter column idIdent [int] identity(1000,1) NOT NULL
Run Code Online (Sandbox Code Playgroud)
会存在.
是否有必要创建一个新列,移动值,删除原始列并重命名新列?
是否可以在SQLite数据库中重新设置自动增量列,如果是这样,这是如何完成的?
即.相当于DBCC CHECKIDENT ('MyTable', RESEED, 1)SQL Server.
我在数据库中有一个Foo名为的表Bar,它有一个名为的列ID,它是主键,并且该数据库位于开发SQL Server上.
我正在尝试将数据从我们的生产服务器复制到开发服务器中,以便我可以使用所述数据,因此我执行以下操作:
set IDENTITY_INSERT Foo.dbo.Bar ON
insert into Foo.dbo.Bar
(
ID
,Something
,Else
,Is
,Going
,Horribly
,Wrong
,With
,SQL
)
select
ID
,Something
,Else
,Is
,Going
,Horribly
,Wrong
,With
,SQL
from Production.Foo.dbo.Bar
set IDENTITY_INSERT Foo.dbo.Bar OFF
Run Code Online (Sandbox Code Playgroud)
我得到了错误
消息8107,级别16,状态1,行1
IDENTITY_INSERT已经为表'Foo.dbo.Bar'打开.无法对表'Foo.dbo.Bar'执行SET操作.
嗯......可以打开表格的IDENTITY_INSERT.所以我SET IDENTITY_INSERT Foo.dbo.Bar ON从查询的顶部删除了,然后执行它,我得到这个错误:
消息544,级别16,状态1,行1
当IDENTITY_INSERT设置为OFF时, 无法在表"Bar"中插入标识列的显式值.
我可以SET IDENTITY_INSERT Foo.dbo.Bar OFF整天执行,但如果我试图将其转换ON,那么SQL Server 2012 IDENTITY_INSERT就已经开启了.
Oracle 12引入了很好的功能(应该很久以前就已经存在了!) - 标识列.所以这是一个脚本:
CREATE TABLE test (
a INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
b VARCHAR2(10)
);
-- Ok
INSERT INTO test (b) VALUES ('x');
-- Ok
INSERT INTO test (b)
SELECT 'y' FROM dual;
-- Fails
INSERT INTO test (b)
SELECT 'z' FROM dual UNION ALL SELECT 'zz' FROM DUAL;
Run Code Online (Sandbox Code Playgroud)
前两个插入运行没有问题,提供'a'为1和2的值.但第三个插入失败ORA-01400: cannot insert NULL into ("DEV"."TEST"."A").为什么会这样?一个bug?关于标识列限制的文档部分中没有提到这样的内容.或者我只是做错了什么?
我正在使用EF4.我想在数据库中插入一个新的MyObject.MyObject有两个字段:
Id:int(Identity)和Name:string
正如我在文档中看到的,实体框架应该在调用SaveChanges()之后将MyObject.Id设置为数据库生成的值,但在我的情况下不会发生.
using (var context = new MyEntities())
{
var myObject = MyObjects.CreateMyObject(0, "something"); // The first parameter is identity "Id"
context.MyObjects.AddObject(myObject);
context.SaveChanges();
return myObject.Id; // The returned value is 0
}
Run Code Online (Sandbox Code Playgroud)
更新:
这发生在我的一个实体中,其他工作正常.顺便说一句,我检查了DB列是标识,StoreGeneratedPattern设置为Identity.这是SSDL.我没有看到任何区别.第一个不正常:
<EntityType Name="OrgUnit">
<Key>
<PropertyRef Name="Srl" />
</Key>
<Property Name="Srl" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
<Property Name="TypeId" Type="smallint" Nullable="false" />
<Property Name="Name" Type="varchar" Nullable="false" MaxLength="80" />
</EntityType>
<EntityType Name="OrgType">
<Key>
<PropertyRef Name="Srl" />
</Key>
<Property Name="Srl" Type="smallint" Nullable="false" StoreGeneratedPattern="Identity" />
<Property Name="Title" Type="varchar" Nullable="false" MaxLength="120" />
<Property …Run Code Online (Sandbox Code Playgroud) 我创建了一个包含列的表现S_ROLL NUMBER(3) NOT NULL在我想将此列作为标识列.我用过这个命令
alter table students
modify
(
S_ROLL NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY
);
Run Code Online (Sandbox Code Playgroud)
然后我收到了这个错误.
S_ROLL NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY
*
ERROR at line 4:
ORA-30673: column to be modified is not an identity column
Run Code Online (Sandbox Code Playgroud) alter table tablename rename column zl_divn_nbr to div_loc_nbr;
Run Code Online (Sandbox Code Playgroud)
执行以上语句时出错。请帮忙。
SQL Error: ORA-54032: column to be renamed is used in a virtual column expression
54032. 0000 - "column to be renamed is used in a virtual column expression"
*Cause: Attempted to rename a column that was used in a virtual column
expression.
*Action: Drop the virtual column first or change the virtual column
expression to eliminate dependency on the column to be renamed
Run Code Online (Sandbox Code Playgroud) identity-column ×10
oracle ×3
sql-server ×3
sql ×2
alter ×1
c# ×1
concurrency ×1
insert ×1
linq-to-sql ×1
oracle12c ×1
primary-key ×1
seed ×1
sqlite ×1
t-sql ×1