我在 mssql 2012 中拥有包含 170 多个表的数据库。其中一些包含字段“UserID”、varchar(9) 而另一些则不包含。由于应用程序重新设计,我需要更改数据库中的所有表以检查该字段是否存在,如果存在,我需要将其更改为 varchar(50)。如果没有,那么我需要添加它。
有人可以指出我如何使用某种批处理程序来做到这一点吗?我对 mssql 数据库没有太多经验,因此将不胜感激。
我当前的表MEDIUMINT用于 ID 列“主键自动增量”。当前表记录很快就会达到最大值,mediumint即8388607。既然如此,我需要将类型int更改为或更改为unsigned不停机。
我的设置是 Amazon RDS 上的主从 MySQL 5.6。我有一个主人和四个奴隶。
pt-table-sync在 Amazon RDS 上使用同步另一个表,然后在新表上进行更改。有什么办法可以int不用锁表就改成?
更新:我不确定该属性是签名还是未签名。我无法找到它签署与否的地方。我运行show columns from table,结果如下:
+----------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+----------------+
| id | mediumint(8) | NO | PRI | NULL | auto_increment |
Run Code Online (Sandbox Code Playgroud) 我有一个特定的表,我无法为其添加密钥:
mysql> ALTER TABLE tasks ADD KEY `fruitful_user_count` (`user_id`, `is_fruitful`);
ERROR 1034 (HY000): Incorrect key file for table 'tasks'; try to repair it
Run Code Online (Sandbox Code Playgroud)
谷歌搜索这个问题似乎这个问题通常是配置问题或磁盘空间问题。事实上,这个数据库运行在一个Amazon RDS实例上,这意味着它基本上是一个专用于MySQL的托管服务器,配置非常标准。此外,分配给我们的磁盘只有大约 25% 已满。
考虑到可能虚拟机上的磁盘(我相信由 Xen 提供支持)已满,而不是我分配的磁盘空间,甚至可能不在同一个房间(网络存储)中,我重新启动了 RDS 实例,希望我能得到另一个 VM 上的新实例。然而,这并没有帮助。
我的下一个故障排除步骤应该是什么?
这是表:
mysql> show create table tasks;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tasks | CREATE TABLE `tasks` (
`user_id` char(32) NOT NULL,
`module_id` int(11) NOT NULL DEFAULT '0',
`is_successful` tinyint(1) DEFAULT NULL,
`is_fruitful` tinyint(1) DEFAULT NULL,
`last_run` timestamp …Run Code Online (Sandbox Code Playgroud) 我如何有 2 列的默认值不正确。当我从另一个来源导入数据库时,不确定它是如何首先创建的。
现在的问题是,我无法对表进行任何更改,因为 MYSQL 会抱怨:
MySQL 说:“campaign_start_date”的默认值无效
如果我尝试添加一列。
但是当我尝试将DEFAULT VALUEto更改为CURRENT_TIMESTAMPfor 时campaign_start_date,它抱怨campaign_end_date有一个无效的默认值。
所以我陷入了一个循环,不允许我对表进行任何更改。
有没有什么办法解决这一问题?
相反:在创建新表时获取所有列是否更好?
我正在开发一个新系统,而且新的要求一直在出现。最新的要求是为每个客户添加一个新的标签字段,以便更容易在新旧系统之间关联数据。新系统尚未投入生产,但已经完成了迁移过程的一些测试运行。
目前,删除表并重新运行批量加载仍然可行,但未来如何 - 当系统中有大量实时数据并且出现对新列的需求时:它对例如,要导出数据,重新创建包含所有列的表,然后再次导入数据,而不仅仅是执行 ALTER TABLE ADD 列......?
如果它有任何不同,该解决方案基于 PostgreSQL 9.5,如果它确实有所不同,那么了解哪些 DBMS 或多或少关心会很有趣。
是否在此列上创建索引会影响答案?例如,当设置了唯一约束时。
在 SQL Server 中,当向具有数百万行的实时 SQL Server 数据库添加允许空值的列时,如果插入或更新与 DDL 更新同时发生,会发生什么情况?
例如:
ALTER TABLE MyTable ADD MyColumn varchar(255) NULL;
Run Code Online (Sandbox Code Playgroud) Alter TABLE [XXX] Alter column [YYY] [varchar](max) NULL
Run Code Online (Sandbox Code Playgroud)
认为
varchar(8000)现在可以更新(可写)。一些其他信息:
NULLthis 中varchar(8000);相关@@VERSION详情:
Microsoft SQL Server 2014 - 12.0.4422.0 (X64)
企业版(64 位)
我正在使用 MS SQL Server。我有一个带有“action_type”列的“action”表,我想为其设置默认值“to do”。我在 MS SQL Studio 中的 DDL 错误!我已经阅读了许多文章,试图找出我做错了什么,但似乎没有任何效果。DDL如下,表CREATE有效,ALTER失败。
CREATE TABLE "action"
( "action" INT IDENTITY(1,1)
, "name" VARCHAR(250) NOT NULL
, "owner" VARCHAR(50)
, "action_type" VARCHAR(50) NOT NULL
, "due_date" DATETIME
, "done_date" DATETIME
, "successful" BIT NOT NULL
, "job" INT
, "contract" INT
, "person" INT
, "description" VARCHAR(MAX)
, "deliverable" VARCHAR(MAX)
, "outcome" VARCHAR(MAX)
, "source" VARCHAR(50)
, "notes" VARCHAR(MAX)
);
ALTER TABLE "action"
ADD CONSTRAINT "df_action_0" DEFAULT "To Do" FOR "action_type";
Run Code Online (Sandbox Code Playgroud)
ALTER 语句返回错误 …
太长了;博士
以下查询在执行时会阻止 postgres 服务器
ALTER TABLE "image_data" ADD COLUMN "user_status" varchar(30) NULL
Run Code Online (Sandbox Code Playgroud)
引擎版本10.6
行数 1.5 mil
你好,
我的生产数据库服务器有一个有点奇怪的问题(我无法在本地服务器上重现)。作为部署过程的一部分,我想添加一个默认值为null的新列。当我运行上述查询(由 dajngo 的迁移过程生成)时,它失败了,并且在此过程中锁定了数据库并阻止了其他查询(非锁定选择)的执行。由于是生产环境,所以几分钟后(大约10分钟)就回滚了。我发现最不寻常的是,相同的查询在我的本地数据库复制(具有与生产完全相同的数据)上执行不到一秒。
编辑:当我运行此事务时,它会阻止所有其他选择查询对数据库的访问 - 我认为(如果我错了,请纠正我)意味着数据库实际上被此事务阻止了。
我需要将列类型从 更改 varchar(100)[]为text[]。该表有 > 100M 行和大量写入负载,因此我想避免获取访问排他锁并重写索引。我看到了这个问题,非阵列varchar来text改变管理这一点,所以我想知道:做同样与阵列列应用?
旧类型要么是二进制强制转换为新类型,要么是新类型上的无约束域)
varchar(100)[]to是这种情况text[]吗?
alter-table ×10
sql-server ×4
ddl ×3
mysql ×3
postgresql ×3
datatypes ×2
amazon-rds ×1
concurrency ×1
constraint ×1
errors ×1
replication ×1