两列A和B,表Y(A,B)称为表X(a,b)。当 Y 中的 A 发生变化时,如何使 Y 中的 B 更改为引用的表 X 值?

  • 本文关键字:中的 何使 引用 两列 变化 postgresql
  • 更新时间 :
  • 英文 :


我正在编写一个WPF程序。在这个程序中,我有两个DataGrid,一个是Quotation List,另一个是Quotation Status ListQuotation ListQuotation Status List的数据都存储在PostgreSQL数据库表quotation_list,quotation_status_list) .

在<<p> strong> quotation_list 表中有两个列,分别命名为statusstatus_colorstatus用于表示状态的引号和status_color用于控制行的前景通过绑定WPFTextBoxControl.
<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>

我想实现的是:

  1. 当用户编辑quotation_status_list中的status_color时表中quotation_list中的所有status_colorstatus_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_colorRed黑色,,则"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   
  1. 当用户编辑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变为Firmstatus_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重复statusstatus_colorquotation_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之前?)串行完成相同的。

最新更新