我的数据库已经老了,我最大的一个INT IDENTITY
列的价值大约是13亿.这将溢出约21亿.我计划增加它的大小,但由于数据库中的记录数量,我不想太快这样做.我可以在增加列大小之前替换我的数据库硬件,这可能会抵消这可能导致的任何性能问题.我还想关注我的数据库中超过50%已满的所有其他列.这是很多表,并且手动检查每个表是不实际的.
这就是我现在获得价值的方式(我知道返回的值可能会略微过时,但这对我的目的来说已经足够了):
PRINT IDENT_CURRENT('MyDatabase.dbo.MyTable')
Run Code Online (Sandbox Code Playgroud)
我可以用它INFORMATION_SCHEMA
来获取这些信息吗?
sql-server maintenance overflow information-schema identity-column
我遇到了一个奇怪的问题,我需要一些帮助来解决这个问题.
我有一个数据库,除了所有的应用程序数据列之外,还有一个ID列(定义为int not null,Identity,从1开始,递增1).表的主键是ID列,没有其他组件.
由于应用程序必须允许多次提交相同数据,因此没有可用作"自然主键"的数据集.
我有一个存储过程,这是将新记录添加到表中的唯一方法(除了直接以db所有者身份登录服务器)
虽然QA今天上午测试应用程序,他们进入一个新的记录到数据库中(使用的应用程序,因为它的目的是,当他们已经做了最后两周),并遇到一个主键违反了此表.
这与我十年来一直在做主键的方式相同,并且从未遇到过这种情况.
有想法该怎么解决这个吗?或者这是在很长一段时间内出现的宇宙射线故障之一.
感谢您提出的任何建议.
奈杰尔
美国东部时间6月12日下午1点15分编辑,以提供更多信息
架构的简化版本......
CREATE TABLE [dbo].[tbl_Queries](
[QueryID] [int] IDENTITY(1,1) NOT NULL,
[FirstName] [varchar](50) NOT NULL,
[LastName] [varchar](50) NOT NULL,
[Address] [varchar](150) NOT NULL,
[Apt#] [varchar](10) NOT NULL
... <12 other columns deleted for brevity>
[VersionCode] [timestamp] NOT NULL,
CONSTRAINT [PK_tbl_Queries] PRIMARY KEY CLUSTERED
(
[QueryID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
(还删除了默认值语句)
存储过程如下
insert …
Run Code Online (Sandbox Code Playgroud) 在使用linq to sql进行插入后,如果我的表有标识列,我可以获取Identity_scope值吗?
使用guids作为标识字段而不是自动递增整数时,是否更容易实现域驱动设计?使用guids,您无需跳转到数据库即可获得实际值.
我有两个表:缺陷和缺陷数据.每个缺陷可能有也可能没有一个或多个缺陷数据.因此,DefectData将DefectId列作为外键.
两个表中的Id都是自动递增的标识.
我遇到的问题是,当我想插入一个新的缺陷及其缺陷数据时,首先插入缺陷并获取一个Id,但我不知道该ID是给DefectData的.我的解决方案是从匹配插入数据的缺陷中选择以获得Id.
设置IdentityInsert然后插入我自己的Id将无法工作,因为这是由网络服务器运行,可能有并发呼叫(我在这里吗?).
提前致谢.
sql insert foreign-key-relationship identity-column sql-server-2008
有人问我是否有一个insert语句,它有一个ID字段是"identity"列,如果分配的值也可以插入到同一个记录中的另一个字段中,则在同一个insert语句中.
这可能吗(SQL Server 2008r2)?
谢谢.
我似乎记得在MySQL中截断一个表时,自动递增的索引字段会在它停止的地方继续.因此,如果所述表被截断,最高id为100,则截断后的下一个id将为101.
有没有办法在SQL Server中执行此操作?我用超过1000行截断了我的表,但在截断后,下一个新ID在我的标识列中返回到1.我希望它继续下去.
我需要在一个包含2列的表中插入大约6400000行
CREATE TABLE [DBName].[DBO].[BigList]
(
[All_ID] [int] identity(1,1) NOT NULL,
[Is_It_Occupied] [int] default(0) not null
)
Run Code Online (Sandbox Code Playgroud)
我今天使用以下代码,这需要很长时间约100分钟.
SET @NumberOfRecordsToInsert = 6400000;
WHILE (@NumberOfRecordsToInsert > 0)
BEGIN
INSERT [DBName].[DBO].[BigList] DEFAULT VALUES;
SET @NumberOfRecordsToInsert = @NumberOfRecordsToInsert - 1
END
Run Code Online (Sandbox Code Playgroud)
有没有人有更好的方法来做到这一点?
当您有标识列时,如何在 Oracle 12c 中使用 SQL 进行多次插入?
INSERT ALL
INTO Table1 (Column2) Values (1)
INTO Table1 (Column2) Values (2)
SELECT * FROM dual;
Run Code Online (Sandbox Code Playgroud)
其中 Table1 将 column1 作为标识,将标识列设置为具有违反主键约束的相同值。
CREATE TABLE Table1 (
Table1Id NUMBER GENERATED ALWAYS AS IDENTITY,
column2 VARCHAR2(255),
column3 NUMBER,
PRIMARY KEY (Table1Id)
);
INSERT ALL
INTO Table1 (column2, column3) VALUES ('a', '1')
INTO Table1 (column2, column3) VALUES ('b', '2')
SELECT * FROM dual;
--SQL Error: ORA-00001: unique constraint violated
Run Code Online (Sandbox Code Playgroud)
我做错了什么?
首先,我知道这是一个相当主观的问题,但我需要某种正式的文件来帮助我教育我的客户。
背景 - 具有数百个表和 SP 的大型企业应用程序,所有表和使用标识列的规范化表和外键都经过精心设计。
我们的客户有一些员工使用我们生产数据库的复制副本在 Crystal 企业中编写复杂的报告。
我们有表格存储我将归类为“系统”基本信息的内容,例如办公室位置或公司内部门的列表、用户的标准角色集、其他对象的状态(打开/关闭等),基本上是数据这不会经常改变。
问题 - 报告设计者和财务分析师正在编写带有硬编码身份值的查询。像这样的东西
SELECT xxx FROM OFFICE WHERE OFFICE_ID = 6
Run Code Online (Sandbox Code Playgroud)
我在这里大大简化了,但基本上他们在他们的过程中到处使用这些硬编码的 int 值。
对于 SQL 开发人员来说,看到这一点显然会让你感到震惊,因为不这样做只是一种内在的本能。
然而,令人惊讶的是,我找不到任何关于为什么不应该这样做的文档甚至最佳实践文章。
他们会争辩说这样做很好,因为这些值永远不会改变,而且他们是对的,在单个系统中,这些值不会改变,但是在多个环境(staging/QA/Dev)中,这些值可以并且绝对不同,使他们的报告设计方法不可移植,并且只能在 1 个隔离的服务器环境中运行。
那里的任何 SQL 大师是否有任何更深入的信息/文章等,我可以用它来帮助我的客户教育他们为什么应该避免这种方法?
identity-column ×10
sql-server ×6
sql ×3
insert ×2
guid ×1
int ×1
linq-to-sql ×1
maintenance ×1
oracle ×1
oracle12c ×1
overflow ×1
primary-key ×1
sql-insert ×1
t-sql ×1