减少 db2 表中 varchar 列的长度z/os 版本

问题描述

A 有一个带有 col1 varchar(2000) 列的 db2 表。 我想将长度从 2000 字节减少到 1600 字节。 可以用 ALTER 做到这一点吗?或者在这种情况下,唯一有效的解决方案是 DROP - CREATE?

ALTER COLUMN col1 SET DATA TYPE VARCHAR(1600) -- doesn't work for reduce size,just for increase

谢谢你的想法!!!

解决方法

对于 v11 或 V12 的 Db2-for-Z/OS,ALTER TABLE...ALTER COLUMN ...SET DATA TYPE ... 的规则包括以下规则:

"如果数据类型是字符或图形字符串,则新的长度 属性必须至少与现有的长度属性一样大 列的。 "

您还没有解释减少列长度的动机,也许要仔细检查一下,以及您所做的哪些假设可能不正确。

,

这就是我要尝试的:

  1. ALTER TABLE thetable ADD COLUMN newcol1 VARCHAR(1600);
  2. UPDATE thetable SET newcol1 = col1;
  3. ALTER TABLE thetable DROP COLUMN col1;
  4. ALTER TABLE RENAME COLUMN newcol1 TO col1;
  5. 重组表空间。
,

ALTER TABLE ALTRE COLUMN SET DATA TYPE 在这种情况下不起作用,因为您正在尝试减小 VARCHAR 列的大小。

piet.t 的解决方案在某些情况下可能有效,当您可以从表中删除列时。在很多情况下,您不能从表中删除列。最好检查 IBM Doc 以了解详细信息并检查它是否适用于您的情况 -> https://www.ibm.com/docs/en/db2-for-zos/12?topic=statements-alter-table

另外,第 2 步需要考虑现有值的长度,一些现有值可能超过 1600 个字符,您需要决定如何截断这些值。

另一方面,您应该检查您的应用程序或数据库的物理设计,看看您是否真的需要减小大小,例如,您通常可以在应用程序代码或 SQL 语句中容忍这种情况。