使用String文字复合外键约束

时间:2017-10-09 09:22:10

标签: postgresql

我有一张带有复合主键的表:

Table "account.enum"
Column   |          Type          | Modifiers
-----------+------------------------+-----------
classname | character varying(256) | not null
name      | character varying(64)  | not null
active    | boolean                | not null
Indexes: "enum_pkey" PRIMARY KEY, btree (classname, name)

值:

classname   |  name  | active
--------------+--------+--------
CURRENCY     | EUR    | t
CURRENCY     | USD    | t
MUTATIONTYPE | CREDIT | t
MUTATIONTYPE | DEBET  | t

另一个表帐户使用此表:

Table "account.mutation"
Column      |          Type          |                       Modifiers
-----------------+------------------------+-------------------------------------------------------
id              | bigint                 | not null default nextval('mutation_id_seq'::regclass)
accountnumber   | character varying(9)   | not null
interestdate    | date                   | not null
balancebefore   | numeric(10,2)          | not null
balanceafter    | numeric(10,2)          | not null
transactiondate | date                   | not null
amount          | numeric(10,2)          | not null
description     | character varying(512) | not null
ordernumber     | smallint               | default (-1)
mutationtype    | character varying(64)  |
currency        | character varying(64)  |

我想添加外键约束(用于突变类型和货币):

alter table mutation add constraint FK_mutationtype foreign key('MUTATIONTYPE', mutationtype) references enum(classname, name);
alter table mutation add constraint FK_currency     foreign key('CURRENCY', currency)         references enum(classname, name);

但是不接受字符串文字。 我究竟做错了什么?在postgres中我想要的是什么?

1 个答案:

答案 0 :(得分:0)

您无法执行此操作,因为外键只能在列上定义,而不能在文字driver.findElement(By.xpath("")).getText();等表达式上定义。

您可以在'MUTATIONTYPE'中引入一个总是设置为mutation_class的{​​{1}}列,但这听起来很浪费,多余且愚蠢。

我认为你应该通过为不同的枚举设置不同的查找表来解决问题,然后难度就会消失,从关系角度看整个设计看起来更合理。