【问题标题】:Can a Foreign key reference a combined Unique key?外键可以引用组合的唯一键吗?
【发布时间】:2015-04-17 18:16:47
【问题描述】:

有没有办法将外键引用到 2row-unique 键?

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!


);

我不知道这是否有意义,但如果你明白了,请帮助我。

【问题讨论】:

  • 为了完整起见,这称为“Composte [foreign] key”(有关语法示例,请参阅this answer)。但是,as Thorsten Kettner suggests,请确保您确实需要一个复合唯一约束,而不仅仅是两个标准唯一约束。
  • 不知道这么叫,非常感谢!这非常有用。

标签: mysql sql foreign-keys unique-key


【解决方案1】:

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

您也可以使用自然键。由于您的表称为factura并且有一列num_factura,我认为这是发布的唯一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 概念的优势在于其技术方法——您可以相当轻松地更改数据库结构。自然密钥概念在数据完整性和轻松数据访问方面非常重要。

【讨论】:

    猜你喜欢
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 2021-04-10
    • 1970-01-01
    相关资源
    最近更新 更多