外键是否可以引用组合的唯一键?

时间:2015-02-17 04:59:32

标签: mysql sql foreign-keys unique-key

有没有办法将外键引用到2row唯一键?

CREATE TABLE factura( 

num_factura varchar(10), 

ID varchar(10), 

UNIQUE (num_factura,ID)

);

CREATE TABLE detalle_factura(

clave_factura varchar(30),

FOREIGN KEY(clave_factura) references factura(num_factura,ID) 

--I know this is not the right way to do it!


);

我不知道这是否合理,但如果你明白了,请帮助我。

1 个答案:

答案 0 :(得分:0)

首先:如果一个表包含一个名为ID的列,我希望这是一个标识记录的唯一ID。通常,ID用作表的主键。

您也可以使用自然键。由于您的表名为factura,并且有一列num_factura,我认为这是发布的唯一因子数。

如果是这样,那么UNIQUE(num_factura,ID)将没有用,因为您希望单个属性是唯一的,而不是它们的一对。如此给定UNIQUE约束,您仍可能具有重复的ID和重复的num_factura。请改用:

CREATE TABLE factura
( 
  num_factura varchar(10) not null, 
  ID varchar(10) not null, 
  UNIQUE KEY (num_factura),
  UNIQUE KEY (ID)
);

(您也可以使用UNIQUE KEY替换PRIMARY KEY个关键字。无关紧要。通常使用您在其他表格中引用的那个。)

现在,您可以基于ID或基于密钥构建数据库。

以下是ID概念的示例:

create table factura
( 
  id int not null auto_increment,
  num_factura varchar(10) not null, 
  ...
  primary key (id),
  unique key (num_factura)
);

create table detalle_factura
(
  id int not null auto_increment,
  id_faktura int,
  ...
  primary key (id),
  foreign key(id_faktura) references factura(id)
);

这是自然关键概念的一个例子:

create table factura
( 
  num_factura varchar(10) not null, 
  id int not null auto_increment, -- In case you want an additional id for the table (for logging maybe). It is not needed.
  ...
  primary key (num_factura),
  unique key (id) -- In case the table shall have this column.
);

create table detalle_factura
(
  faktura_num varchar(10),
  faktura_sub_num varchar(10),
  id int not null auto_increment, -- Again: Only if you want this additional ID for some purpose.
  ...
  primary key (faktura_num, faktura_sub_num),
  foreign key(faktura_num) references factura(faktura_num),
  unique key (id) -- ditto
);

取决于您使用哪种概念。 ID概念在其技术方法方面具有优势 - 您可以更轻松地更改数据库结构。在数据完整性和轻松访问数据时,自然的关键概念非常强大。