繁体   English   中英

引用另一个表中的多个主键

[英]Referencing multiple primary keys in another table

我正在使用DB2创建一些表。 我有2张桌子,看起来像这样:

create table TEST_TABLE1
/* */
(
PRIMARY_COLUMN1 int not null,
PRIMARY_COLUMN2 varchar(50) not null,
primary key (PRIMARY_COLUMN1,PRIMARY_COLUMN2)
);

create table TEST_TABLE2
/* */
(
PRIMARY_COLUMN1 int references TEST_TABLE1(PRIMARY_COLUMN1) not null,
PRIMARY_COLUMN2 varchar(50) references TEST_TABLE1(PRIMARY_COLUMN2) not null,
primary key(PRIMARY_COLUMN1,PRIMARY_COLUMN2)
);

当我尝试添加表时,出现此错误:

SQL0573N  A column list specified in the references clause of constraint 
"PRIMARY_COLUMN1..." does not identify a unique constraint of the parent table 
or nickname "DB2INST1.TEST_TABLE1".  SQLSTATE=42890

有人知道我如何让TEST_TABLE2引用TEST_TABLE1吗?

我也尝试过像这样创建TEST_TABLE2并得到相同的错误:

create table TEST_TABLE2
/* */
(
PRIMARY_COLUMN1 int references TEST_TABLE1(PRIMARY_COLUMN1) not null,

primary key(PRIMARY_COLUMN1)
);

谢谢贾斯汀

根据经验法则,外键只能引用唯一键。

合理的解释是..说你有名字

FIRST LAST
-----------
John Abraham
John Jones

当您仅参考FIRST列创建外键引用时,父级中可能有两个值。 这显然是模棱两可的! 而当您创建包含这两个列的引用(唯一)时,歧义不再存在!

您收到的错误消息指出相同。

does not identify a unique constraint of the parent table 

现在...分析您的DDL,

create table TEST_TABLE1
/* */
(
PRIMARY_COLUMN1 int not null,
PRIMARY_COLUMN2 varchar(50) not null,
primary key (PRIMARY_COLUMN1,PRIMARY_COLUMN2)  <<----- Unique over 2 columns
);

您在包括2列的Table1中定义一个PK。

在第二张表中,您只需创建引用这些列之一的外键即可! 这样的错误。

create table TEST_TABLE2
/* */
(
PRIMARY_COLUMN1 int 
   references TEST_TABLE1(PRIMARY_COLUMN1) not null, <<--------FK refers only one of them?

primary key(PRIMARY_COLUMN1) 
);

解决方案可能是:

create table TEST_TABLE2
/* */
(
PRIMARY_COLUMN1 int  not null,
PRIMARY_COLUMN2 varchar(50) not null,
primary key(PRIMARY_COLUMN1,PRIMARY_COLUMN2),
CONSTRAINT my_foreign FOREIGN KEY (PRIMARY_COLUMN1,PRIMARY_COLUMN2)
                    REFERENCES TEST_TABLE1(PRIMARY_COLUMN1,PRIMARY_COLUMN2)
     <<---- Refer both columns..
);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM