【问题标题】:Generate column value automatically from other columns values and be used as PRIMARY KEY从其他列值自动生成列值并用作 PRIMARY KEY
【发布时间】:2015-10-30 15:55:24
【问题描述】:

我有一个表,其中有一个名为“source”和“id”的列。该表是从开放数据数据库中填充的。 “id”不能是唯一的,因为我的数据来自其他具有自己的 id 系统的数据库。拥有相同的 id 但真正不同的数据确实存在风险。

我想创建另一列将源和 id 组合成一个值。

"openDataA" + 123456789 -> "openDataA123456789"
"openDataB" + 123456789 -> "openDataB123456789"

我见过使用 || 的例子和连接值的功能。这很好,但我想让这第三列成为我的主键,以避免重复,并创建一个真正唯一的 id,我可以在没有太多计算的情况下进行查询,并且可以将其用作其他表的外键约束。

我认为复合类型是我正在寻找的,但不是每次手动设置值,我想通过仅设置“源”和“id”来自动获取它们

我对 postgresql 还很陌生,所以欢迎任何帮助。 谢谢。

【问题讨论】:

    标签: postgresql primary-key ddl primary-key-design


    【解决方案1】:

    您的表中可能只有一个复合键:

    CREATE TABLE mytable (
        source VARCHAR(10),
        id VARCHAR(10),
        PRIMARY KEY (source, id)
    );
    

    如果你真的想要一个连接的列,你可以创建一个视图来显示它:

    CREATE VIEW myview AS 
    SELECT *, source || id AS primary_key
    FROM   mytable;
    

    【讨论】:

    • 非常感谢!如何查询复合键?我不需要给它起名字吗?另外,我将在文档中查看 VIEW,我不知道这一点,它看起来很有趣。再次感谢您!
    • @Lionel 您可以像查询表一样查询视图(例如,select * from myview where primary_key = 'openDataB123456789',或者单独查询表的字段:select * from my_table where source = 'openDataA' and id ='123456789'
    • 再次感谢您,如果您可以的话,我会再麻烦您最后一次。哪种解决方案会更快?
    • @Lionel 肯定会分别查询这两个字段。它使您免于冗余连接字符串。
    猜你喜欢
    • 1970-01-01
    • 2021-12-26
    • 2023-03-26
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多