微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何确保列值始终以大写形式添加?

如何解决如何确保列值始终以大写形式添加?

我有一个现有的列 host,并希望确保列值 host 始终添加Uppercase 中。

我正在使用 Alter Table 命令,如下所示:

ALTER TABLE `mydb`.`myTable` 
CHANGE COLUMN `host` `host`
VARCHAR(255) GENERATED ALWAYS AS (UPPER()) STORED;

这导致了错误,我无法更改列。

操作失败:将 sql 脚本应用到数据库时出错。 错误 1582:调用本机函数“UPPER”时参数计数不正确 sql语句: 更改表 mydb.myTable 更改列 host host VARCHAR(255) 始终作为 (UPPER()) 虚拟生成

我想确保向前移动 host 中插入的值始终在 uppercase 中。 我想通过在运行时更新 uppercase 中的值来实现这一点。 我不想添加任何 constraint,因为在 host 中输入 lowercase 值时会导致错误

解决方法

目前还不清楚您要做什么。

如果您想在表上设置只允许 host 中的大写字母的约束,请使用检查约束:

alter table mytable
    add constraint chk_host_upper
    check (host rlike '^[A-Z]*$')
;

这可以防止将小写字符写入列;尝试这样做会导致运行时错误。

另一方面,如果您想创建一个新列,则无论实际的列代码如何,都会返回大写的 host 值:

alter table mytable
     add column host_upper varchar(50)  -- same as the original column
     as (upper(host))
;

有了这个设置,您可以在需要大写值时查询新列 host_upper


最后:如果您想在 insert 上即时将输入值转换为大写,那么您需要一个触发器:

delimiter //

create trigger mytrigger
before insert on mytable
for each row
begin
    set new.host = upper(new.host);
end
//

分隔符;

,

您可以只分配 host 列以具有不区分大小写的排序规则:

ALTER TABLE mydb.myTable MODIFY host VARCHAR(255)
CHARACTER SET latin1
COLLATE latin1_swedish_ci;

现在插入时使用的 host 的大小写无关紧要,您可以使用任何大小写与此列进行比较。如果您仍然需要查看 host 为大写,那么只需使用 UPPER():

SELECT UPPER(host) AS host_upper
FROM myTable;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。