1

我正在寻找一个智能序列生成器,如果表中已经存在字符串列值,它将能够为列分配一个常量 int 值。场景如下

_____________________________
|   Col1  |  Col2  |  Col 3 |
|---------------------------|
|    a    |    a   |    1   |
|    b    |    a   |    1   |
|    c    |    a   |    1   |
|    u    |    b   |    2   |
|    v    |    b   |    2   |
|    w    |    b   |    2   |
-----------------------------

假设我分别向 Col1 和 Col2 插入另一个值,即 ('d','a'),我希望 Col3 自动变为 '1',因为对应于 'a' 的 Col3 值已经作为 '1' 存在并变为见下文

_____________________________
|   Col1  |  Col2  |  Col 3 |
|---------------------------|
|    a    |    a   |    1   |
|    b    |    a   |    1   |
|    c    |    a   |    1   |
|    u    |    b   |    2   |
|    v    |    b   |    2   |
|    w    |    b   |    2   |
|    d    |    a   |    1   |
------------------------------

有没有办法可以在“创建表”中定义它,以便在将值插入 Col1、Col2 时发生 Col3 值更新?

编辑 :

场景是这样的

______________________________________________________________
|   Col1                           |    Col2        |  Col 3 |
|------------------------------------------------------------|
|    Adobe                         |    Adobe       |    1   |
|    Adobe Systems                 |    Adobe       |    1   |
|    Adobe Systems Inc             |    Adobe       |    1   |
|    Honeywell                     |    Honeywell   |    2   |
|    Honeywell Inc                 |    Honeywell   |    2   |
|    Honeywell Inc.                |    Honeywell   |    2   |
--------------------------------------------------------------

当我添加新数据时,我希望它是

______________________________________________________________
|   Col1                           |    Col2        |  Col 3 |
|------------------------------------------------------------|
|    Adobe                         |    Adobe       |    1   |
|    Adobe Systems                 |    Adobe       |    1   |
|    Adobe Systems Inc             |    Adobe       |    1   |
|    Honeywell                     |    Honeywell   |    2   |
|    Honeywell Inc                 |    Honeywell   |    2   |
|    Honeywell Inc.                |    Honeywell   |    2   |
|    Adobe Systems Incorporated    |    Adobe       |    1   |
--------------------------------------------------------------

Col3 值必须是整数才能更快地与其他表连接。我将为 Col1 和 Col2 插入值,插入时对应的值应该在 Col3 中可用。

4

2 回答 2

3

只是标准化它:

create table corporation (
    corporation_id serial,
    short_name text
);

insert into corporation (short_name) values
('Adobe'),('Honeywell');

select * from corporation;
 corporation_id | short_name 
----------------+------------
              1 | Adobe
              2 | Honeywell

现在你的表是:

|    Adobe                         |    1
|    Adobe Systems                 |    1
|    Adobe Systems Inc             |    1
|    Honeywell                     |    2
|    Honeywell Inc                 |    2
|    Honeywell Inc.                |    2
|    Adobe Systems Incorporated    |    1
于 2015-12-08T16:42:34.447 回答
0

Col3 值必须是整数才能更快地与其他表连接。

因此,您需要唯一但不一定是顺序的值。您可以使用哈希函数将字符串映射为唯一整数,例如:

postgres=# select hashtext('Adobe');
 hashtext  
-----------
 173079840
(1 row)

postgres=# select hashtext('Honeywell');
  hashtext  
------------
 -453308048
(1 row)

使用这样的函数,您无需在表中查找现有值。

但是您真的确定使用字符串作为外键会遇到性能问题吗?我认为你应该在你的数据上进行测试。(还在即将推出的 9.5 上进行测试,具有缩写键功能。)

于 2015-12-08T15:35:59.563 回答