Postgresql无法更改列的数据类型

Postgresql无法更改列的数据类型,sql,database,postgresql,Sql,Database,Postgresql,我是Postgresql新手,正在尝试将列的数据类型从Integer更改为Varchar(20),但我遇到了一个奇怪的错误: ERROR: operator does not exist: character varying <> integer : No operator matches the given name and argument type(s). You might need to add explicit type casts.****

我是Postgresql新手,正在尝试将列的数据类型从
Integer更改为Varchar(20)
,但我遇到了一个奇怪的错误:

   ERROR:  operator does not exist: character varying <> integer :
      No operator matches the given name and argument type(s). 
    You might need to add explicit type casts.********** Error **********

谢谢你的帮助。谢谢。

使用
使用表达式。它允许您定义值转换:

ALTER TABLE LOGIN ALTER COLUMN USERNAME TYPE varchar(20) USING ...expression...;
发件人:

可选USING子句指定如何计算新列 旧的价值观;如果省略,默认转换与 从旧数据类型转换为新数据类型的赋值。USING子句必须是 如果没有从旧到新的隐式或赋值转换,则提供 类型


使用表达式使用
。它允许您定义值转换:

ALTER TABLE LOGIN ALTER COLUMN USERNAME TYPE varchar(20) USING ...expression...;
发件人:

可选USING子句指定如何计算新列 旧的价值观;如果省略,默认转换与 从旧数据类型转换为新数据类型的赋值。USING子句必须是 如果没有从旧到新的隐式或赋值转换,则提供 类型


问题在于用户名的检查约束。您可以使用目录pg_约束以某种方式解决此问题:

SELECT conname, consrc
  FROM pg_constraint
 WHERE conrelid =
    (SELECT oid
       FROM pg_class
      WHERE relname LIKE 'login');
在“consrc”字段中,您可能会注意到约束实际上类似于“(username NULL::integer)”,并且当您尝试将列类型从integer更改为varchar时,它会带来一个错误

要删除约束,请使用

ALTER TABLE LOGIN DROP CONSTRAINT login_username_check;
ALTER TABLE LOGIN DROP CONSTRAINT login_check;
其中“login\u username\u check”和“login\u check”是您从上面的查询中得到的connames(小心并双重检查这些名称)

在那之后你应该试着

ALTER TABLE LOGIN ALTER COLUMN USERNAME TYPE varchar(20);
如果您的表中没有数据,这应该可以工作。如果没有,请添加一个

ALTER TABLE dev.tests_LOGIN ALTER COLUMN USERNAME TYPE varchar(20) USING USERNAME::VARCHAR;
您可能希望恢复密码“”检查,因此您必须再进行一次更改才能恢复密码。祝你好运

您可能会发现一些便利的PostgreSQL文档:

PS:如上所述,当您在列描述中已经没有NULL时,您不需要进行约束(!=NULL)检查。此外,空检查有点不同。快速说明:

SELECT (NULL = NULL);
SELECT (NULL != NULL);
SELECT (NULL IS NULL);
SELECT (NULL IS NOT NULL);

问题在于用户名的检查约束。您可以使用目录pg_约束以某种方式解决此问题:

SELECT conname, consrc
  FROM pg_constraint
 WHERE conrelid =
    (SELECT oid
       FROM pg_class
      WHERE relname LIKE 'login');
在“consrc”字段中,您可能会注意到约束实际上类似于“(username NULL::integer)”,并且当您尝试将列类型从integer更改为varchar时,它会带来一个错误

要删除约束,请使用

ALTER TABLE LOGIN DROP CONSTRAINT login_username_check;
ALTER TABLE LOGIN DROP CONSTRAINT login_check;
其中“login\u username\u check”和“login\u check”是您从上面的查询中得到的connames(小心并双重检查这些名称)

在那之后你应该试着

ALTER TABLE LOGIN ALTER COLUMN USERNAME TYPE varchar(20);
如果您的表中没有数据,这应该可以工作。如果没有,请添加一个

ALTER TABLE dev.tests_LOGIN ALTER COLUMN USERNAME TYPE varchar(20) USING USERNAME::VARCHAR;
您可能希望恢复密码“”检查,因此您必须再进行一次更改才能恢复密码。祝你好运

您可能会发现一些便利的PostgreSQL文档:

PS:如上所述,当您在列描述中已经没有NULL时,您不需要进行约束(!=NULL)检查。此外,空检查有点不同。快速说明:

SELECT (NULL = NULL);
SELECT (NULL != NULL);
SELECT (NULL IS NULL);
SELECT (NULL IS NOT NULL);

错误的原因是您具有的无用的附加检查约束(
null
):

运算符不存在:字符可变整数:

指的是条件<代码>用户名!=在两个检查约束中都为NULL

(SQL中的“not equals”操作符是
,并且
!=
会被重新写入其中)

因此,首先需要去掉这些检查约束。该检查的默认生成名称为
login\u username\u check
,因此以下内容最有可能起作用:

alter table login 
   drop constraint login_username_check;
另一项检查很可能是
登录检查

alter table login 
   drop constraint login_check;
删除这些检查约束后,您可以更改数据类型:

ALTER TABLE LOGIN 
    ALTER COLUMN USERNAME set data TYPE varchar(20);
现在需要重新添加密码的约束:

alter table login 
    add constraint check_password check (password <> '');

错误的原因是您具有的无用的附加检查约束(
null
):

运算符不存在:字符可变整数:

指的是条件<代码>用户名!=在两个检查约束中都为NULL

(SQL中的“not equals”操作符是
,并且
!=
会被重新写入其中)

因此,首先需要去掉这些检查约束。该检查的默认生成名称为
login\u username\u check
,因此以下内容最有可能起作用:

alter table login 
   drop constraint login_username_check;
另一项检查很可能是
登录检查

alter table login 
   drop constraint login_check;
删除这些检查约束后,您可以更改数据类型:

ALTER TABLE LOGIN 
    ALTER COLUMN USERNAME set data TYPE varchar(20);
现在需要重新添加密码的约束:

alter table login 
    add constraint check_password check (password <> '');

表是空的,还是有数据?NOT NULL执行此操作,无需添加另一个NOT NULL尝试。表是空的,还是有数据?NOT NULL执行此操作,无需添加另一个NOT NULL尝试。由于(无用)检查约束
USERNAME!=空
。由于其中的
运算符,错误消息实际上“指向”了该约束。由于(无用的)检查约束
用户名!=空
。由于其中的
运算符,错误消息实际上“指向”了该约束。