我正在编写一个WPF程序。在这个程序中,我有两个DataGrid
,一个是Quotation List
,另一个是Quotation Status List
。Quotation List
和Quotation Status List
的数据都存储在PostgreSQL数据库表quotation_list,quotation_status_list) .
status
和status_color
。status
用于表示状态的引号和status_color
用于控制行的前景通过绑定WPF
TextBox
Control.
<DataGridTemplateColumn SortMemberPath="status" CanUserSort="True" Header="Status" Width="100" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Name="Box_status" Foreground="{Binding status_color}" Text="{Binding status}" IsReadOnly="True" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn SortMemberPath="status_color" CanUserSort="True" Header="Color" Width="100" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Name="Box_status_color" Foreground="{Binding status_color}" Text="{Binding status_color}" IsReadOnly="True" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
我想实现的是:
- 当用户编辑quotation_status_list中的
status_color
时表中quotation_list中的所有status_color
status_color
将被更改。
quotation_status_list
id | status | status_color
----+----------+--------------
1 | Active | Red
2 | Firm | Blue
quotation_list
id | status | status_color | title
----+----------+--------------+--------
1 | Active | Red | abc
2 | Firm | Blue | def
3 | Active | Red | hij
修改后的status_color
Red黑色,,则"quotation_list
"中的"status_color
"的值会自动改变。
quotation_status_list
id | status | status_color
----+----------+--------------
1 | Active | Black
2 | Firm | Blue
quotation_list
id | status | status_color | title
----+----------+--------------+--------
1 | Active | Black | abc
2 | Firm | Blue | def
3 | Active | Black | hij
- 当用户编辑quotation_list中的
status
时在quotation_status_list中将其status_color
的值改为status_color
表。
quotation_status_list
id | status | status_color
----+----------+--------------
1 | Active | Red
2 | Firm | Blue
quotation_list
id | status | status_color | title
----+----------+--------------+--------
1 | Active | Red | abc
2 | Firm | Blue | def
3 | Active | Red | hij
修改后,第一行的status
变为Firm,status_color
将改为Blue自动.
quotation_status_list
id | status | status_color
----+----------+--------------
1 | Active | Red
2 | Firm | Blue
quotation_list
id | status | status_color | title
----+----------+--------------+--------
1 | Firm | Blue | abc
2 | Firm | Blue | def
3 | Active | Red | hij
为了实现这两个功能,我尝试通过 创建两个Tablequotation_status_list
CREATE TABLE IF NOT EXISTS quotation_status_list
(
id SERIAL UNIQUE NOT NULL,
status TEXT UNIQUE NOT NULL,
status_color TEXT UNIQUE NOT NULL,
PRIMARY KEY(id, status, status_color)
);
quotation_list
CREATE TABLE IF NOT EXISTS quotation_list
(
id SERIAL UNIQUE NOT NULL,
title TEXT NOT NULL,
status TEXT NOT NULL,
status_color TEXT NOT NULL,
FOREIGN KEY(status, status_color)
REFERENCES quotation_status_list(status, status_color)
ON DELETE NO ACTION
ON UPDATE CASCADE
) ;
我可以创建quotation_status_list但是我不能创建quotation_list.错误是
there is no unique constraint matching given keys for referenced table "quotation_status_list"
会出现什么问题,quotation_status_list中的status
,status_color
应该是UNIQUEPRIMARY KEY.我用错方法了吗?或者数据库不能完成这项工作?
欢迎提出任何建议。
在quotation_status_list中不需要3列的PK,单列就足够了。然后Do not重复status
和status_color
quotation_list。删除它们,并添加包含quotation_status_list的PK的列。
create table quotation_status_list(
id integer generated always as identity primary key
, status text unique not null
, status_color text unique not null
);
create table if not exists quotation_list(
id integer generated always as identity
, title text not null
, quotation_status_id integer
references quotation_status_list(id)
on delete no action
) ;
现在检索状态和status_color连接表:
select ql.title
, qs.status
, gs.status_color
from quotation_list ql
join quotation_status_list qs
on (qs.id = ql.quotation_status_id);
现在任何更改(除了PK,它应该永远不)quotation_status_list中的Be changed会自动反映在select中。
注意:我使用较新的首选generated as identity
作为键。如果你有一个旧的Postgres版本,它不支持(v10之前?)串行完成相同的。