【问题标题】:Storing a case insensitive varchar in PostgreSQL在 PostgreSQL 中存储不区分大小写的 varchar
【发布时间】:2010-10-23 06:51:25
【问题描述】:

我想在 SQL 表中为我的用户名 varchar 添加一些约束,以便如果用户名存在,则无法创建不同情况下的重复用户名。我怎样才能做到这一点?谢谢

编辑:
我正在使用 PostgreSQL,非常感谢您提供一些语法帮助。

【问题讨论】:

    标签: postgresql collation case-insensitive


    【解决方案1】:

    如果尚未填充表,您可以考虑在进行任何插入之前简单地转换为标准的大写或小写,并使该字段成为主键(或仅具有唯一约束)。如果用户想在他指定的情况下查看他的用户 ID,这可能是数据库中的另一列。

    更新:基于更新的标签,我仍然建议我提出的解决方案较少依赖特定的 DBMS。

    【讨论】:

    • -1 抱歉。以两种不同的方式存储用户名时,只有一种方式可以从另一种方式中简单地计算出来,才会产生不好的后果。正如 Endlessdeath 的回答所示,这里没有必要打破规范化。
    【解决方案2】:

    来自docs

    CREATE UNIQUE INDEX lower_title_idx ON films ((lower(title)));
    

    【讨论】:

    • 这之后还需要给表添加约束吗?我尝试这样做:ALTER TABLE films ADD CONSTRAINT unique_file_title UNIQUE USING INDEX lower_title_idx; 但出现错误Cannot create a primary key or unique constraint using such an index. Index contains expressions. 我尝试插入不区分大小写的数据,即使没有约束它似乎也能工作。
    【解决方案3】:

    请注意,PostgreSQL 8.4(目前为测试版)将有一个case-insensitive text type

    【讨论】:

    • 必须在每个新数据库上运行一次CREATE EXTENSION citext; 语句
    猜你喜欢
    • 1970-01-01
    • 2013-04-23
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    相关资源
    最近更新 更多