Questions tagged «alter-table»

用于更改现有表对象的SQL语句。

5
为什么将ALTER COLUMN设置为NOT NULL会导致大量日志文件增长?
我有一个表,其中有64m行,其数据占用磁盘上4.3 GB的空间。 每行大约是30个字节的整数列,外加一个NVARCHAR(255)用于文本的可变列。 我添加了一个NULLABLE列,具有data-type Datetimeoffset(0)。 然后,我为每一行更新了该列,并确保所有新插入的内容在该列中都放置了一个值。 一旦没有NULL条目,我就运行以下命令使我的新字段成为必填项: ALTER TABLE tblCheckResult ALTER COLUMN [dtoDateTime] [datetimeoffset](0) NOT NULL 结果是事务日志大小从6GB大幅增加到36GB以上,直到空间用完为止! 有谁知道SQL Server 2008 R2在做什么,以使这个简单的命令取得如此巨大的增长?

1
如何在MySQL中交换表?
假设我有一个表foo,其中包含不时计算的一些统计信息。其他查询大量使用它。 这就是为什么我要在其中计算更多最新统计信息foo_new并在计算准备就绪时交换它们。 我可以做 ALTER TABLE foo RENAME foo_tmp; ALTER TABLE foo_new RENAME foo; 但是,如果在foo没有表的情况下查询需要在这两行之间有表,该foo怎么办?我想我必须以某种方式锁定它...还是有另一种方法可以锁定它?

3
将列添加到生产表
在SQL Server 2008 R2上的大型生产表中添加列的最佳方法是什么?根据微软在线书籍: ALTER TABLE中指定的更改将立即实施。如果更改需要修改表中的行,则ALTER TABLE将更新行。ALTER TABLE在表上获取一个模式修改锁,以确保在更改期间没有其他连接甚至引用该表的元数据,除非联机索引操作最后需要非常短的SCH-M锁。 (http://msdn.microsoft.com/zh-cn/library/ms190273.aspx) 在具有数百万行的大型表上,这可能需要一段时间。停电是唯一的选择吗?处理这种情况的最佳方法是什么?

4
我需要在没有可用磁盘空间的情况下运行VACUUM FULL
我有一张桌子占用了我们服务器上接近90%的高清空间。我决定删除几列以释放空间。但是我需要将空间返回给操作系统。但是,问题是我不确定如果我运行VACUUM FULL并且没有足够的可用空间来复制表,会发生什么。 我知道不应该使用VACUUM FULL,但是我认为这是这种情况下的最佳选择。 任何想法,将不胜感激。 我正在使用PostgreSQL 9.0.6

2
将列从NOT NULL更改为NULL-到底发生了什么?
我们有一个包含2.3B行的表。我们想将列从NOT NULL更改为NULL。该列包含在一个索引中(而不是聚集索引或PK索引)。数据类型没有改变(它是一个INT)。只是可空性。声明如下: Alter Table dbo.Workflow Alter Column LineId Int NULL 在停止该操作之前,该操作花费了超过10(我们甚至还没有让它运行完毕,因为这是一项阻塞操作,并且花费了太长时间)。我们可能会将表复制到开发服务器,以测试实际需要多长时间。但是,我很好奇,是否有人知道从NOT NULL转换为NULL时SQL Server在做什么?另外,是否需要重建受影响的索引?生成的查询计划不会指示正在发生的事情。 有问题的表是群集的(不是堆)。

6
更改实时生产数据库上的表
此问题是从Stack Overflow 迁移而来的,因为可以在Database Administrators Stack Exchange上回答。 迁移 7年前。 大多数“流行的”(MySQL,Postgres ...)数据库系统如何处理更改实时生产数据库上的表(如添加,删除或更改列的类型)? 我知道正确的方法是备份所有计划停机时间,然后进行更改。 但是...当前的数据库系统是否支持“在线”执行这些操作而不停止任何操作?(也许只是延迟引用刚被更改/删除的列的查询) 当我ALTER TABLE...在实时运行的数据库上进行操作时,会发生什么?发生这种情况时,一切都会停止吗?数据会损坏吗?等等 同样,我主要指的是Postgres或MySQL,因为它们是我遇到的。 (是的,是的,我必须在做“正确的方式”之前做任何事情,备份事情,安排例行工作……。但是我只是想知道是否有可能做这样的事情,而事情“很快又脏”或是否有任何数据库系统实际上支持“快速,活动和脏”模式更改) 有人刚才建议的在线模式修改为MySQL从Facebook脚本(有教程这里和源在这里)......似乎是一个很好的方式来自动执行了一套“哈克”的方式来做到这一点...有没有人用它在类似于生产吗?

3
如何以最少的停机时间将rowversion列添加到大型表
此问题是从Stack Overflow 迁移而来的,因为可以在Database Administrators Stack Exchange上回答。 迁移 7年前。 使用SQL Server 2008和更高版本时,我想将rowversion列添加到大型表中,但是当我只是 ALTER TABLE [Tablename] ADD Rowversion [Rowversion] NOT NULL 然后,该表无法用于更新太长时间。 我可以使用哪些策略来减少停机时间?我会考虑的。当然,越简单越好,但是我会考虑任何策略。 我的想法是,作为最后的选择,我可以维护一个由触发器维护的副本登台表,然后将登台表sp_rename重命名为原始表。但我希望有一些更简单/更轻松的方法。

4
内存优化表-它们真的很难维护吗?
我正在研究从MS SQL 2012升级到2014的好处。SQL2014的最大卖点之一是内存优化表,该表显然使查询超快。 我发现在内存优化表上有一些限制,例如: 没有(max)大小字段 每行最大〜1KB 没有timestamp领域 没有计算列 无UNIQUE约束 这些都是令人讨厌的东西,但是如果我真的想解决这些问题以获得性能上的好处,我可以制定一个计划。 真正的缺点是您不能运行一条ALTER TABLE语句,并且每次将一个字段添加到索引列表中时,都必须经过这个严格INCLUDE的规定。此外,似乎必须将用户拒之于系统之外,以便对实时DB上的MO表进行任何模式更改。 我发现这完全是令人发指的,以至于我实际上无法相信Microsoft可以在此功能上投入这么多的开发资金,而使它的维护非常不切实际。这使我得出一个结论,就是我一定弄错了方向。我一定对内存优化表有误解,这使我相信维护它们的难度要比实际困难得多。 那么,我误会了什么?您是否使用过MO表?是否有某种秘密的开关或过程使它们易于使用和维护?



3
重设IDENTITY值
我有一个带有IDENTITY列的表。在开发时,我会不时删除这些行,然后再次添加它们。但是,当我再次添加IDENTITY值时,它们始终保持增加,并且不是从1开始。现在我的ID是从68-> 92,这使我的代码崩溃。 如何重置IDENTITY值?

2
ALTER TABLE上的数据库“冻结”
今天早上,我们的生产环境只是冻结*一段时间,当更改表格时,实际上添加了一列。 令人反感的SQL:ALTER TABLE cliente ADD COLUMN topicos character varying(20)[]; *登录到我们的系统需要从同一张表中进行选择,因此在更改表期间没有人可以登录。实际上,我们必须终止进程以使系统恢复正常运行。 表结构: CREATE TABLE cliente ( rut character varying(30) NOT NULL, nombre character varying(150) NOT NULL, razon_social character varying(150) NOT NULL, direccion character varying(200) NOT NULL, comuna character varying(100) NOT NULL, ciudad character varying(100) NOT NULL, codigo_pais character varying(3) NOT NULL, …

1
更改nvarchar列的大小时,是否需要删除唯一索引?并且在重新创建索引时表会被锁定吗?
在我们的数据库中,存在一个或多或少如下所示的大表: CREATE TABLE dbo.production_data ( pd_id BIGINT PRIMARY KEY, serial NVARCHAR(16) NOT NULL UNIQUE, ... ); 但是现在串行字段的大小已经变小,因此我想将其更改为32。VisualStudio架构比较工具建议通过以下方式进行操作: DROP INDEX ux_production_data_serial ON dbo.production_data; GO ALTER TABLE dbo.production_data ALTER COLUMN serial NVARCHAR(32) NOT NULL; GO CREATE INDEX ux_production_data_serial ON dbo.production_data(serial ASC); 这真的需要吗?还是更像是一种超级节省的方式? 另外,当重新创建唯一索引时,我的表会被锁定吗?因为这将是一个大问题(因为该表具有3000万行,我想重新创建索引将花费相当长的时间),因为下一个维护窗口将在未来几个月内进行。我有什么选择?

3
在具有索引列的大表上使用ALTER TABLE
我有一个带有VARCHAR(20)列的大表,我需要对其进行修改以成为VARCHAR(50)列。通常,在此特定表上执行ALTER TABLE(添加TINYINT)大约需要90-120分钟才能完成,因此,我实际上只能在周六或周日晚上这样做,以免影响数据库的用户。如果可能的话,我想在此之前进行此修改。 该列也已建立索引,我认为这会使ALTER TABLE变慢,因为它必须在修改列长后重建索引。 该Web应用程序是在MySQL复制环境中设置的(26个从属和一个主控)。我记得曾经读过某个地方的一种方法,即首先在每个从属服务器上执行ALTER TABLE(对用户的影响最小),然后在主服务器上执行此操作,但是那不是然后尝试将ALTER TABLE命令复制到从属服务器吗? 所以我的问题是:对我来说,以最小的用户干扰来修改此表的最佳方法是什么? 编辑:该表是InnoDB。

3
为什么简单的ALTER TABLE命令在带有全文索引的表上花费这么长时间?
我有一个很大的(约6700万行)名称/值表,该值在DataValue列上具有全文本索引。 如果我尝试运行以下命令: ALTER TABLE VisitorData ADD NumericValue bit DEFAULT 0 NOT NULL; 它运行1小时10分钟,但仍无法在VisitorData包含约6700万行的表上完成。 为什么要花这么长时间而没有完成? 我该怎么办? 以下是有关表格的更多详细信息: CREATE TABLE [dbo].[VisitorData]( [VisitorID] [int] NOT NULL, [DataName] [varchar](80) NOT NULL, [DataValue] [nvarchar](3800) NOT NULL, [EncryptedDataValue] [varbinary](max) NULL, [VisitorDataID] [int] IDENTITY(1,1) NOT NULL, CONSTRAINT [PK_VisitorData_VisitorDataID] PRIMARY KEY CLUSTERED ( [VisitorDataID] ASC ) WITH (PAD_INDEX …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.