- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 Vertica 中有一个表,它具有 time_stamp:int 值 Unix 时间戳,我想将此数据类型从 int 更改为 TIMESTAMPTZ
;
我试过了
ALTER TABLE exploded_names ALTER COLUMN time_stamp SET DATA TYPE TIMESTAMPTZ;
但是出现如下错误
ROLLBACK 2353: Cannot alter type of column "time_stamp" since it is referenced in the segmentation expression of projection "exploded_names_b0"
then I tried to drop that projection :
drop projection exploded_names_b0 CASCADE;
ROLLBACK 4122: No up-to-date super projection left on the anchor table of projection exploded_names_b0HINT: Use DROP TABLE ... CASCADE to drop the anchor table and its last projection, or create a replacement super projection instead
我不想放下 table 。
最佳答案
您收到的错误告诉您该列用于投影的分段表达式,因此无法更改。这是对 SET DATA TYPE
选项的限制。您可以创建新的 super 投影并省略分段子句中的列,或者创建一个新表和具有新列类型的投影。
由于您提到当前列是 int
类型,因此它不会转换为 TIMESTAMPTZ
。这是我会做的:
第 1 步 - 设置示例数据
CREATE TABLE public.exploded_names (
id int,
time_stamp int
);
INSERT INTO public.exploded_names (id, time_stamp) VALUES (1, 1403635837);
COMMIT;
第 2 步 - 添加新列
ALTER TABLE public.exploded_names ADD COLUMN iso_time TIMESTAMPTZ;
第 3 步 - 创建新的 super 投影
我们将使用 SELECT EXPORT_OBJECTS('', 'public.exploded_names');
CREATE PROJECTION public.exploded_names /*+createtype(L)*/
(
id,
time_stamp,
iso_time
)
AS
SELECT exploded_names.id,
exploded_names.time_stamp,
exploded_names.iso_time
FROM public.exploded_names
ORDER BY exploded_names.id,
exploded_names.time_stamp
SEGMENTED BY hash(exploded_names.id, exploded_names.time_stamp) ALL NODES KSAFE 1;
SELECT MARK_DESIGN_KSAFE(1);
我们需要删除 time_stamp
列并在分段子句上添加 iso_time
并更改新 super 投影的名称:
CREATE PROJECTION public.exploded_names_2
(
id,
time_stamp,
iso_time
)
AS
SELECT exploded_names.id,
exploded_names.time_stamp,
exploded_names.iso_time
FROM public.exploded_names
ORDER BY exploded_names.id,
exploded_names.time_stamp
SEGMENTED BY hash(exploded_names.id, exploded_names.iso_time) ALL NODES KSAFE 1;
SELECT MARK_DESIGN_KSAFE(1);
第 4 步 - 填充新列
在这里,我们将使用转换后的 Unix 时间戳更新 iso_time
列,然后刷新新的 super 投影。
UPDATE public.exploded_names SET iso_time = TO_TIMESTAMP(time_stamp);
COMMIT;
SELECT REFRESH('public.exploded_names');
第 5 步 - 丢弃旧的超投影
我们需要推进古代历史标记,然后放下旧的 super 投影:
SELECT MAKE_AHM_NOW();
DROP PROJECTION public.exploded_names;
第 6 步 - 验证预测
让我们确保我们有正确的投影设置 SELECT GET_PROJECTIONS('public.exploded_names');
:
Current system K is 1.# of Nodes: 3.Table public.exploded_names has 2 projections.Projection Name: [Segmented] [Seg Cols] [# of Buddies] [Buddy Projections] [Safe] [UptoDate] [Stats]----------------------------------------------------------------------------------------------------public.exploded_names_2_b1 [Segmented: Yes] [Seg Cols: "public.exploded_names.id", "public.exploded_names.iso_time"] [K: 1] [public.exploded_names_2_b0] [Safe: Yes] [UptoDate: Yes] [Stats: RowCounts]public.exploded_names_2_b0 [Segmented: Yes] [Seg Cols: "public.exploded_names.id", "public.exploded_names.iso_time"] [K: 1] [public.exploded_names_2_b1] [Safe: Yes] [UptoDate: Yes] [Stats: RowCounts]
附带说明一下,如果您还没有运行数据库设计器,则应该运行数据库设计器以获得优化的投影。
关于sql - 垂直中的 ALTER 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24392793/
我知道这不是什么大问题,但还是让我觉得很痒。 我有一个 SQL Server 2005 脚本来创建新的数据表、约束、更改一些表以添加列、更改过程以将表更改考虑在内等。 一切正常,直到脚本遇到我的 AL
我需要一个包含三列的数据框:i、j(改变)和 k(j 的改变)。我有一个邻接矩阵(下面的示例)。从那里我可以获得一个图形对象并提取边缘列表。我如何操作数据以获得类似于下面的 WANT 数据框的输出?
假设我有这个 SQL 语句: ALTER TABLE dbo.[tbl] ALTER COLUMN col1 varchar(300) ALTER TABLE dbo.[tbl] ALTER COLU
我在表中有一列,因此它不再是 NVARCHAR(256),而是 NVARCHAR(MAX)。我知道执行此操作的命令 (ALTER TABLE ALTER COLUMN NVARCHAR(MAX))。我
我在表中有一列,因此它不再是 NVARCHAR(256),而是 NVARCHAR(MAX)。我知道执行此操作的命令 (ALTER TABLE ALTER COLUMN NVARCHAR(MAX))。我
假设我有这两个 ALTER TABLE: ALTER TABLE tableName ADD COLUMN colName INT(11) AFTER colName2 ALTER TABLE tab
我正在尝试扩展 IdentityUser 类。我添加了一个新类 ApplicationUser 并继承了 IdentityUser 类。迁移已成功添加,但在更新数据库时,出现错误“对象 'PK_Asp
我想将 sql server 2005 表中的列修改为 IDENTITY(1,1) 顺便说一句,该表是空的,要更改的列是主键。 该列也是另外两个表的外键。 谷歌搜索后我发现你不能使用Alter tab
这是我要实现的目标:我在列表中有四个按钮,每个按钮都有白色背景和独特的彩色边框。单击一个按钮时,其背景颜色将与其边框颜色相同。单击第二个按钮时,第一个按钮恢复正常,第二个按钮的背景填充第二个按钮的边框
我在 clickhouse 有一张 table ,比如“my_table”,它有复制品(my_table_rep1,...)。我需要添加一个列,类型为 float64,默认值 (-1)。 我该怎么做?
alter FUNCTION [Kuri].[fnGetAge](@kuri_cust_Id int,@amt decimal) RETURNS SMALLINT AS BEGIN D
我试图确保当我 mysqldump 数据库时约束在执行以下查询后按数字顺序排列。当我在没有 AFTER 的情况下进行转储(这不起作用)时,它显示 phppos_sales_ibfk_3 作为第一个约束
我有两个表:cleanup 和 uniqueEntries。它们都有一个自动递增的id作为主键。 uniqueEntries 的表结构来自 cleanup,如下所示: $sql = "CREATE T
我有一个包含以下数据和结构的表: Date Analyst Start Time Stop Time 4/2/2018 Bill Smith 7:00
This question already has answers here: Error renaming a column in MySQL
是否可以更改表的多(复合)列键? 示例表: CREATE TABLE `test_abc` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `
我尝试执行 oracle alter session 查询以更改语言设置,但失败并出现错误“ORA-01036:非法变量名称/编号”。 preparedStatement = connection.p
我正在与一位客户合作,他希望大型数据库中的每个表的每条记录都有历史数据,并且为了美观,希望这些列位于每个表的末尾。例如: 表名 主键 数据列 历史专栏 所以我的问题是,是否有一个 SQL 命令可以将列
我正在尝试更改 SQL Server 2000 更新触发器,但它一直挂着、挂着、挂着。为什么会发生这种情况,我该怎么做才能解决这个问题?这是一个长触发器,这可能是为什么? 触发代码较长,简化如下: A
我正在将我的 mysql 数据库表从 id (auto) 更改为 uid。 ALTER TABLE companies DROP PRIMARY KEY; ALTER TABLE companies
我是一名优秀的程序员,十分优秀!