我有一个带有 IDENTITY 列的表。在开发时,我不时删除行并再次添加它们。但是 IDENTITY 值总是不断增加并且当我再次添加它们时并没有从 1 开始。现在我的 id 从 68 -> 92 开始,这会导致我的代码崩溃。
如何重置 IDENTITY 值?
我有以下表格,
CREATE TABLE users (id int PRIMARY KEY);
-- already exists with data
CREATE TABLE message ();
Run Code Online (Sandbox Code Playgroud)
我如何改变messages表格,
sender被添加到其中sender引用users表的外键在哪里这没有用
# ALTER TABLE message ADD FOREIGN KEY (sender) REFERENCES users;
ERROR: column "sender" referenced in foreign key constraint does not exist
Run Code Online (Sandbox Code Playgroud)
这个语句也不会创建列吗?
我有一个带有 VARCHAR(20) 列的大表,我需要将其修改为 VARCHAR(50) 列。通常,在此特定表上执行 ALTER TABLE(添加 TINYINT)大约需要 90-120 分钟才能完成,因此我实际上只能在周六或周日晚上执行此操作以避免影响数据库的用户。如果可能,我想在此之前进行此修改。
该列也被索引,我认为这会使 ALTER TABLE 变慢,因为它必须在修改列长度后重建索引。
Web 应用程序设置在 MySQL 复制环境中(26 个从站和一个主站)。我记得曾经在某处读到过一种方法是首先在每个从站上执行 ALTER TABLE(最大限度地减少对用户的影响),然后在主站上执行此操作,但那不会尝试将 ALTER TABLE 命令复制到从站吗?
所以我的问题是:对我来说,在对用户的干扰最小的情况下修改此表的最佳方法是什么?
编辑:该表是 InnoDB。
是否有一个或一行命令来修改数据库中的所有表。我想在数据库中的每个表中发出此命令:
ALTER TABLE `table_name` CONVERT TO CHARACTER SET utf8;
Run Code Online (Sandbox Code Playgroud)
我的目标是将字符集从 latin1 修改为 utf8 到所有表。
更新: RDBMS 是 MySQL
CREATE TABLE TestTab (ID INT IDENTITY(1,1), st nvarchar(100))
INSERT INTO TestTab (st) values ('a')
INSERT INTO TestTab (st) values ('b')
INSERT INTO TestTab (st) values ('c')
INSERT INTO TestTab (st) values ('d')
INSERT INTO TestTab (st) values ('e')
INSERT INTO TestTab (st) SELECT TOP 10000 st from testtab
GO 30
ALTER TABLE TestTab ADD newcol nvarchar(10) DEFAULT 'newcol'
UPDATE TestTab SET newcol = 'newcol' --6 sec
ALTER TABLE TestTab ADD newcol1 nvarchar(10) DEFAULT 'newcol1' NOT NULL
DROP TABLE TestTab
Run Code Online (Sandbox Code Playgroud)
当我执行这个测试脚本时, …
我有一个要更改的 InnoDB 表。该表有大约 80M 行,并退出了一些索引。
我想更改其中一列的名称并添加更多索引。
alter table,最快的解决方案吗?这个时候,我只关心速度 :)
我有一个大型(约 6700 万行)名称-值表,该表在DataValue列上具有全文索引。
如果我尝试运行以下命令:
ALTER TABLE VisitorData ADD NumericValue bit DEFAULT 0 NOT NULL;
Run Code Online (Sandbox Code Playgroud)
它运行了 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 = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
CONSTRAINT [UNQ_VisitorData_VisitorId_DataName] …Run Code Online (Sandbox Code Playgroud) 在我们的数据库中存在一个大表,或多或少是这样的:
CREATE TABLE dbo.production_data
(
pd_id BIGINT PRIMARY KEY,
serial NVARCHAR(16) NOT NULL UNIQUE,
...
);
Run Code Online (Sandbox Code Playgroud)
但是现在串行字段的大小变得很小,所以我想将其更改为 32。Visual Studio 模式比较工具建议通过以下方式执行此操作:
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);
Run Code Online (Sandbox Code Playgroud)
这真的需要吗?或者更像是这样做的超级保存方式?
另外在重新创建唯一索引时,我的表会被锁定吗?因为这将是一个大问题(因为该表有 3000 万行,我猜重新创建索引需要相当长的时间),因为下一个维护窗口是未来几个月。我的选择是什么?
尝试向NOT NULL具有 10 亿行的表添加约束。我无法承受超过几秒钟的表锁。有没有办法在alter table 语句期间防止全表扫描?我在列上创建了一个索引,希望它能被使用,但这似乎不起作用。可能是检查约束?其他选择?谢谢!
我们在ALTER TABLE几个小时前开始了一个查询,直到最近才意识到(通过pg_stat_activity)它正在等待锁定。我们发现另一个查询在我们想要更改的表上持有锁,并且不放手。
我们的查询是一个“简单”的查询(改变列数据类型),但它运行在一个庞大的表上。
我们决定与其杀死持有锁的进程,不如杀死ALTER TABLE.
我们没有将包装ALTER TABLE在交易中。
据我了解,我们的查询正在等待锁的事实意味着它一直在等待锁,并且从未改变任何东西。
这是真的?我们完全取消ALTER TABLE查询是否安全?或者查询是否可能已经修改了某些内容并取消它会使我们的数据库处于某种中间状态?
PS:计划是使用SELECT pg_cancel_backend(pid);. 如果这是一个坏主意,请告诉我。
alter-table ×10
sql-server ×4
ddl ×3
mysql ×3
postgresql ×3
index ×2
innodb ×2
locking ×2
foreign-key ×1
identity ×1
replication ×1
waits ×1