Questions tagged «alter-table»

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


2
将600GB表索引键数据类型从INT更改为BIGINT的最快方法
我需要将600GB MySQL表中的数据类型从INT更改为BIGINT。该列具有唯一索引。对于未签名的INT,我可能会很好,但是我认为更改为BIGINT或BIGINT会非常痛苦。该表的引擎是InnoDB。什么会更容易: 更改表 复制结构和 INSERT INTO (SELECT *) 转储表和更改转储文件表定义 还要别的吗? 更新:根据要求,MySQL ver 5.5.15,没有外键并创建表: CREATE TABLE `tbl` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL, `created_at` datetime NOT NULL, `tid` bigint(20) NOT NULL, `t` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `f` tinyint(1) NOT NULL, `i_id` bigint(20) NOT …

4
将NVARCHAR(4000)列快速更改为NVARCHAR(260)
我在使用非常大的内存授予时遇到了一个性能问题,需要处理两NVARCHAR(4000)列该表。问题是这些列永远不会大于NVARCHAR(260)。 使用 ALTER TABLE [table] ALTER COLUMN [col] NVARCHAR(260) NULL 导致SQL Server重写整个表(并在日志空间中使用2倍的表大小),这是数十亿行,只能更改任何内容,这是不可行的。增大列宽不会出现此问题,但是减小它确实会出现此问题。 我尝试创建约束,CHECK (DATALENGTH([col]) <= 520)或者CHECK (LEN([col]) <= 260)SQL Server仍然决定重新编写整个表。 有什么方法可以将列数据类型更改为仅元数据操作?无需重写整个表?我正在使用SQL Server 2017(14.0.2027.2和14.0.3192.2)。 这是用于重现的示例DDL表: CREATE TABLE [table]( id INT IDENTITY(1,1) NOT NULL, [col] NVARCHAR(4000) NULL, CONSTRAINT [PK_test] PRIMARY KEY CLUSTERED (id ASC) ); 然后运行ALTER。

3
将大表上的更改列速度提高到NON NULL
我最近在一个表中添加了一个可为NULL的位列,该表具有近5亿行。列上没有默认值,但是所有插入都将值指定为0或1,并且我运行了一次例程,将0或1分配给所有现有行(小批量更新行)。现在,每一行在该列中应具有0或1。 我想使bit列不可为空,但是当我尝试通过via进行操作时ALTER TABLE t1 ALTER COLUMN c1 bit not null,它开始运行了3分钟,并且我停止了它,因为它阻止了对表的所有读取,并且我怀疑它将花费很长时间才能完成。可能不会花费太长时间,但是我不能冒太多不可用的风险。回滚本身花费了6分钟。 您对我如何使该列不可为空而不可能花费数小时才能完成有什么建议? 另外,有什么方法可以估算ALTER TABLE ALTER COLUMN我开始然后取消的语句需要多长时间? 我正在使用SQL Server 2017 Web Edition。

4
在列上放置约束(索引)
如何修改具有索引的表的类型?我试图在一个空表上做一个alter列,以将类型从日期时间修改为varchar(15),并收到错误消息说它对列有依赖性(原来是索引)。 通过右键单击索引并编写脚本脚本,可以轻松地在本地解决此问题,但需要在无法访问索引名称的其他服务器上进行扩展。 有没有办法使脚本删除所有索引,让我在列上更改数据类型,然后读取索引?谢谢!

5
MySQL-用于InnoDB的ALTER TABLE的最快方法
我有一个要更改的InnoDB表。该表有约8000万行,并退出了一些索引。 我想更改其中一列的名称并添加更多索引。 最快的方法是什么(假设即使停机,我也可能会遭受痛苦-服务器是未使用的从属服务器)? 是“普通” alter table的最快解决方案吗? 此时,我只关心速度:)

2
我可以在一个查询中重命名MySQL ENUM列中的值吗?
假设我有一个带的数据库表ENUM('value_one','value_two')。我想将其更改为ENUM('First value','Second value')。我目前正在这样做,如下所示: ALTER TABLE `table` MODIFY `column` ENUM('value_one','value_two','First value','Second value'); UPDATE `table` SET `column`='First Value' WHERE `column`='value_one'; UPDATE `table` SET `column`='Second Value' WHERE `column`='value_two'; ALTER TABLE `table` MODIFY `column` ENUM('First value','Second value'); 有没有更有效的方式来做到这一点,例如,用一个做到这一点的方式 单一的 ALTER TABLE声明?

2
快速将NULL列更改为NOT NULL
我有一个包含数百万行的表和一个允许NULL值的列。但是,当前没有任何行具有该列的NULL值(我可以通过查询很快地验证这一点)。但是当我执行命令时 ALTER TABLE MyTable ALTER COLUMN MyColumn BIGINT NOT NULL; 相对而言,查询将永远花费。实际上,它需要10到20分钟,是添加检查约束的两倍多。有没有一种方法可以立即更新该列的表元数据,特别是因为我知道该列没有行具有NULL值?

1
ALTER TABLE…DROP COLUMN真的是仅元数据操作吗?
我发现了一些表明ALTER TABLE ... DROP COLUMN是仅用于元数据的操作的源。 资源 怎么会这样?是否不需要从基础非聚集索引和聚集索引/堆中清除DROP COLUMN期间的数据? 此外,为什么Microsoft Docs暗示它是完全记录的操作? 对表所做的修改将被记录并且可以完全恢复。影响大表中所有行的更改(例如删除列或在某些版本的SQL Server上添加具有默认值的NOT NULL列)可能需要很长时间才能完成并生成许多日志记录。与影响许多行的任何INSERT,UPDATE或DELETE语句一样小心地运行这些ALTER TABLE语句。 作为第二个问题:如果未从基础页面中删除数据,引擎将如何跟踪丢失的列?

4
如何将具有外键约束的列添加到已存在的表中?
我有下表 CREATE TABLE users (id int PRIMARY KEY); -- already exists with data CREATE TABLE message (); 我该如何更改messages表格, 一个名为的新列sender被添加到其中 sender引用该users表的外键在哪里 这没用 # ALTER TABLE message ADD FOREIGN KEY (sender) REFERENCES users; ERROR: column "sender" referenced in foreign key constraint does not exist 此语句是否也不会创建该列?

1
将可为空的列添加到表的时间超过10分钟
我在表上添加新列时遇到问题。 我尝试运行几次,但是运行了十多分钟后,由于锁定时间,我决定取消查询。 ALTER TABLE mytable ADD mycolumn VARCHAR(50); 有用的信息: PostgreSQL版本:9.1 行数:〜250K 列数:38 可为空的列数:32 约束数量:5(1 PK,3 FK,1 UNIQUE) 索引数:1 操作系统类型:Debian Squeeze 64 我发现了有关PostgreSQL管理可空列的方式的有趣信息(通过HeapTupleHeader)。 我的第一个猜测是,因为此表已经具有8位的32个可空列MAXALIGN,所以HeapTupleHeader的长度为4个字节(未经验证,我不知道该怎么做)。 因此,添加新的可为空的列可能需要在每行上更新HeapTupleHeader以添加新的8位MAXALIGN,这可能会导致性能问题。 因此,我尝试更改可为空的列之一(实际上并不是真正可为空的),以便将可为空的列的数量减少到31,以检查我的猜测是否正确。 ALTER TABLE mytable ALTER myothercolumn SET NOT NULL; 不幸的是,这种更改也需要很长时间,超过5分钟,因此我也中止了它。 您是否知道会导致这种性能损失的原因?

1
修改(减少)列的长度时会发生什么?
可以说我有两列类型NUMBER(无精度和小数位数)和VARCHAR(300)。我看到这些列对于我的数据来说太大了,所以我想将它们修改为NUMBER(11)和VARCHAR(10)。因此,如果我运行此SQL语句: ALTER TABLE FOO MODIFY(BAR NUMBER(10)); 我可以在非空列上执行此操作吗? 如果是这样,那么如果有一个大于的值NUMBER(10),oracle会告诉我吗? 如果先前定义,列默认值是否会保持不变? 列为空的选项会保持不变吗? 该列上的主键,外键,唯一键是否保持不变? 涉及该列的约束条件将保持不变吗? 该列上的索引会保持不变吗? 是否有任何官方文件回答我的问题?

2
取消等待锁定的PostgreSQL ALTER TABLE查询是否安全?
我们在ALTER TABLE几个小时前开始查询,直到最近(通过pg_stat_activity)才意识到它正在等待锁。我们发现了另一个查询,该查询在我们要更改的表上拥有一个锁,并且不让它走。 我们的查询是一个“简单”查询(更改列数据类型),但是它在大型表上运行。 我们决定杀死而不是杀死保持锁定状态的进程,而不是杀死ALTER TABLE。 我们并没有包裹ALTER TABLE在一个事务中。 据我了解,我们的查询正在等待锁的事实意味着它一直在等待锁,并且从未更改过任何内容。 这是真的?我们完全取消ALTER TABLE查询是否安全?还是查询已经修改了某些内容并取消它会使我们的数据库处于某种中间状态? PS:计划使用取消它SELECT pg_cancel_backend(pid);。如果这是个坏主意,请告诉我。

2
PostgreSQL是否优化添加具有非NULL默认值的列?
在添加NOT NULL带有DEFAULT值的列时-PostgreSQL是否优化了此操作? 如果表有n行,那么未优化的alter-table-add-column将产生默认值的n次写入-显然,这很痛苦。通过优化,数据库将立即创建新列,仅存储默认值的一个副本,当在合适的索引数据结构中找不到该列的非默认值时将返回该默认值。 例如,Oracle 11g进行了这样的优化。

3
SQL为列设置允许的值
我想做一个ALTER TABLE表达式,添加一个新列并设置一个默认值,另外定义该列的允许值。它是一个文本列,并且只能是“ value1”,“ value2”和“ value3”。默认值应为“ value1” 根据以下语法图: 我到了这一点 ALTER TABLE exampleTable ADD COLUMN new_column VarChar(20) DEFAULT 'value1' 但我绝对不确定如何设置允许的值。 有可能使像 约束检查new_column IN('value1','value2','value3) ?我必须承认该search condition图使我感到困惑。
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.