标签: alter-table

更改多个数据库的表(相同的表名)

有没有一种好方法可以为多个数据库(例如 50 个左右)更改表(添加列)。或者对他们来说几乎都是手册?

表都是一样的,添加的列也一样。

谢谢!

sql-server alter-table

5
推荐指数
1
解决办法
1万
查看次数

MySQL 中的在线架构迁移:什么时候开始?

我是社交媒体 SAAS 的技术负责人,目前我们正在体验存储在 mySQL 数据库中的数据量大幅增加。

我们只有一个MySQL数据库,除了许多非常小的表外,我们还有两个大约500k-1.5m行的表。

目前,在执行 DDL 查询(向这些表添加新列)时,我们必须处理相当长的执行时间(around 4-5 mins)

我开始搜索在线模式迁移技巧,发现以下内容:

尽管这些策略值得研究,但我开始感到不舒服:我不认为,行数如此之少的表必须使用如此高级的方法。(那么真正巨大的桌子呢?)

所以我想知道,你们中是否有人有关于 mysql.cnf 本身的提示,或者 ddl 查询的其他性能提示?

mysql alter-table mysql-5.5 ddl percona-server

5
推荐指数
1
解决办法
1074
查看次数

更新语句给出无效的列名错误,即使该列存在

我在此存储过程开始时创建了一个临时表。它创建成功,可以从中选择和插入。这是创建语句

CREATE TABLE #tmpImportData 
( GuideFirstName VARCHAR(MAX), 
  GuideLastName VARCHAR(MAX), 
  email VARCHAR(MAX), 
  group_id_text VARCHAR(MAX), 
  CandidateName VARCHAR(MAX), 
  grade_text VARCHAR(5), 
  dateofbirth DATE
)
Run Code Online (Sandbox Code Playgroud)

我的问题是在更改临时表后尝试更新列。我收到错误:

消息 207,级别 16,状态 1
无效的列名

代码:

declare @SQl1 nvarchar(max)
set @SQL1 ='
ALTER TABLE #tmpImportData 
ADD group_id INT
ALTER TABLE #tmpImportData 
ADD guide_id INT
ALTER TABLE #tmpImportData 
ADD password_plain_text VARCHAR(500)
ALTER TABLE #tmpImportData 
ADD guide_email VARCHAR(500)
ALTER TABLE #tmpImportData 
ADD class_id INT'

exec sp_executesql @Sql1

UPDATE #tmpImportData 
SET group_id = CAST(group_id_text AS INT)

UPDATE #tmpImportData 
SET group_id = 0 …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql alter-table update temporary-tables

5
推荐指数
1
解决办法
2万
查看次数

在 sql server 事务中更改表和更新

我正在尝试做一个更改表来在表上添加一个新列,然后我想对表中的现有行进行一些更新以向最近添加的列添加一个值,最后执行一个 select * 以检查一切是否正常,然后回滚整个事情。

就像是

declare @transactionNameA varchar(20);
declare @transactionNameB varchar(20);
select @transactionNameA = 'TransactionA';
select @transactionNameB = 'TransactionB';

begin transaction @transactionNameA
alter table A add Column int;

begin transaction @transactionNameB
update A set Column = 1 where ID=1;
select * from A;

rollback transaction @transactionNameB;
rollback transaction @transactionNameA;
Run Code Online (Sandbox Code Playgroud)

当我编写该代码时,我收到一条错误消息,指出该列不存在

我究竟做错了什么?感谢您的时间和帮助。

sql-server alter-table

5
推荐指数
1
解决办法
7914
查看次数

不使用 Alter Table 权限截断表

所以我的 DBA 不希望开发人员授予 Alter table 权限。现在我们创建的过程之一需要截断表(因为显然delete只删除记录,但truncate 也释放了空间)。

现在为了使用 truncate 所需的最低权限是“Alter table”。(来源

但也有一个解决方案描述为“创建一个存储过程,以所有者身份执行仅对一个表或对任何表的存储过程”(由 user3854427 提供)。

我的问题是对他提供的代码的回应。嵌入代码以方便参考:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:      Yimy Orley Asprilla
-- Create date: Julio 16 de 2014
-- Description: Función para hacer TRUNCATE a una tabla.
-- =============================================
ALTER PROCEDURE [dbo].[spTruncate]
    @nameTable varchar(60)  


WITH EXECUTE AS OWNER
AS

SET NOCOUNT OFF;

DECLARE @QUERY NVARCHAR(200);

SET @QUERY = N'TRUNCATE TABLE ' + @nameTable + ';' …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql alter-table

5
推荐指数
2
解决办法
2116
查看次数

有什么理由不添加“rowversion”列?

TechNet 文章“优化链接到 SQL Server 的 Microsoft Office Access 应用程序”建议向从 MS Access 链接的 SQL Server 表添加rowversion列。从支持并发检查部分:

Office Access 会自动检测表何时包含此类列,并在影响该表的所有 UPDATE 和 DELETE 语句的 WHERE 子句中使用它。这比验证所有其他列仍然具有与上次刷新动态集时相同的值更有效。

好消息是每个 UPDATE/DELETE 语句和绑定表单都将从这个添加中受益,而无需在 MS Access 中进行任何更改(除了重新链接表)。

直到最近我才知道这个功能。我正在考虑向我从 MS Access 链接到的 SQL Server 中的每个表添加一个命名的rowversion列。 在我这样做之前,我应该注意哪些缺点?

显然会有存储要求和性能影响,但我认为这些可以忽略不计。此外,其中一些表是合并复制场景中的项目;这有什么区别吗?

ms-access sql-server concurrency alter-table merge-replication

5
推荐指数
1
解决办法
1457
查看次数

列无法从“int”类型转换为“bigint(20) unsigned”类型?

我有一个 Percona MySQL 集群,有一个主节点和几个从节点。他们每个人都运行 MySQL 的“Ver 14.14 Distrib 5.5.40-36.1”。复制是基于行的。

我仅对从属设备的其中一张表运行了更改查询。计划是在所有从服务器上运行此查询,然后进行主切换,因为我们无法承受在主服务器上锁定表。

查询是:

ALTER TABLE order_item_units 
MODIFY parent_id BIGINT(20) unsigned ;
Run Code Online (Sandbox Code Playgroud)

并在我使用检查从站时发布此信息show slave status,我看到复制被破坏并出现以下错误:

表“database_name.order_item_units”的第 3 列无法从“int”类型转换为“bigint(20) unsigned”类型

当我检查该列时,它确实转换为BIGINT.

现在我无法解决这个问题。我确实停止了奴隶并启动了奴隶,没有帮助。没有停止奴隶和 MySQL 重新启动,没有帮助。做了一个跳过计数器,也没有帮助。

要么该列不应该被转换,那么错误就是正确的,但可能根本不应该有任何错误。

如果列确实被转换了,那么为什么会出现错误?

任何线索我在这里错过了什么?

mysql replication alter-table percona

5
推荐指数
1
解决办法
4844
查看次数

ALTER TABLE 中的 DROP/ADD UNIQUE 约束是原子的吗?

我有UNIQUE一个表上的多个字段的约束。我想更改此约束中的字段(删除一个字段)的图像。通常我会做这样的事情:

DROP INDEX unique_name ON table_name;
CREATE UNIQUE INDEX unique_name ON table_name (field1, field2, ...);
Run Code Online (Sandbox Code Playgroud)

但这是两个语句,在执行第一个语句后将UNIQUE不再有约束,因此任何INSERT可能都可能破坏约束,直到新的UNIQUE创建的。

还有另一种方法可以做到这一点:

ALTER TABLE table_name
DROP INDEX unique_name, 
ADD CONSTRAINT unique_name UNIQUE (field1, field2, ...);
Run Code Online (Sandbox Code Playgroud)

这是一种说法。问题是:这个语句会执行原子操作吗?我所说的原子是指完全没有约束的时候就没有时间窗口UNIQUE

mysql index alter-table unique-constraint

5
推荐指数
1
解决办法
6130
查看次数

如何在巨大的负载下在巨大的事务数据库中将主键的数据类型从 int 更改为 bigint?

这是一个遗留系统,每天处理 1000 万笔交易的表中有超过 10 亿条记录。

现在应用程序抱怨:

将 IDENTITY 转换为数据类型 int 时出现算术溢出错误

我们想将该id列的数据类型更改为bigint,但它无法执行并且超时。

我们应该做什么?我一点头绪也没有。我们无法停止系统,因为它是一个单一的应用程序和数据库,可以做很多事情。因此,我们不希望停止整个系统。

我们正在使用 SQL Server 10.50.6000.34,即 SQL Server 2008 R2 SP3(2014 年 9 月)

sql-server alter-table identity

5
推荐指数
2
解决办法
2191
查看次数

如何在表扫描期间不锁定表的情况下将列设置为 NOT NULL?

(前一个问题是:将多个列设置为非空时,Postgres 会使用多列索引吗?)


通常,当我将列设置为非空时,如果它没有索引,那么我首先添加它,以便 postgres 可以(希望)在锁定表的同时进行表扫描时使用索引,以便表被锁定在较短的时间内。

我想设置几列不为空,如下所示:

alter table foos
  alter column bar1 set not null
  alter column bar2 set not null
  alter column bar3 set not null
  alter column bar4 set not null;
Run Code Online (Sandbox Code Playgroud)

如果我为这些列创建了多列索引,那么在进行此更改之前,postgres 会在扫描锁定表时使用它吗?

CREATE INDEX CONCURRENTLY my_index on foos (bar1, bar2, bar3, bar4);
Run Code Online (Sandbox Code Playgroud)

如果我在 IS NULL(或 IS NOT NULL)上建立了部分索引怎么办

CREATE INDEX CONCURRENTLY my_index on foos (bar1, bar2, bar3, bar4) where bar1 is null and bar2 is null and bar3 is null and bar4 is null;
Run Code Online (Sandbox Code Playgroud)

postgresql index null alter-table locking

5
推荐指数
1
解决办法
928
查看次数