我有一个我认为已被错误宣布的专栏。它包含数据,我不希望丢失数据。
我希望将定义从varchar(max)更改为varchar(整数)。我的印象是我不能只改变列类型?
创建临时列的最佳方法是“column2”,将数据传输到此列,从有问题类型的列中删除问题列,然后将temp列重命名为原始有问题的列?
如果是,如何将问题列中的值复制到新列?
编辑:对于有相同问题的任何人,您可以只使用ALTER语句。
答案 0 :(得分:22)
只要数据类型有点“相关” - 是的,你绝对可以这样做。
您可以将INT
更改为BIGINT
- 第二种类型的值范围更大,因此您不会“丢失”任何数据。
您可以将VARCHAR(50)
更改为VARCHAR(200)
- 再次,类型兼容,尺寸越来越大 - 没有截断任何内容的风险。
基本上,你只需要
ALTER TABLE dbo.YourTable
ALTER COLUMN YourColumn VARCHAR(200) NULL
或其他什么。只要你没有超过200个字符的任何字符串,你就可以了。不确定如果确实有更长的字符串会发生什么 - 转换会因错误而失败,或者它会继续并告诉您某些数据可能已被截断。因此,我建议您首先在数据的副本上进行尝试: - )
如果您需要将VARCHAR
更改为INT
或类似的东西,这会变得有点棘手 - 显然,如果您的列值不适合新类型,转换将失败。但即使使用单独的“临时”新列也无法解决这个问题 - 你需要以某种方式处理那些“不兼容”的情况(忽略它们,在那里留下NULL,将它们设置为默认值 - 某些东西)。 p>
此外,如果你有例如VARCHAR
和NVARCHAR
之间切换可能会变得棘手非西欧字符 - 您可能会在转换时丢失某些条目,因为它们无法以其他格式表示,或者从一种类型到另一种类型的“默认”转换无法按预期工作。
答案 1 :(得分:2)
计算该表的该列的最大数据长度store。
Select max(len(fieldname)) from tablename
现在,您可以将该列的大小减小到上一次查询中得到的结果。
ALTER TABLE dbo.YourTable
ALTER COLUMN YourColumn VARCHAR(200) NULL
答案 2 :(得分:1)
根据PostgreSQL docs,你可以简单地alter table
ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);
但是这就是
只有当列中的每个现有条目都可以通过隐式转换转换为新类型时,才会成功。如果需要更复杂的转换,您可以添加一个USING子句,指定如何从旧值中计算新值。
答案 3 :(得分:0)
添加一个类型为varchar(NN)的temp column2,运行update tbl set column2 = column
,检查是否有错误发生;如果一切正常,请更改原始列,复制数据并删除column2。