有没有一种方法可以将外键引用到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!
);
我不知道这是否有意义,但如果你明白了,请帮帮我。
首先:如果一个表包含一个名为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)
);
(你也可以用PRIMARY KEY
替换其中一个UNIQUE KEY
关键字。哪一个并不重要。你通常会使用你在其他表中引用的那个。)
现在,您可以构建基于ID或基于natuaral密钥的数据库。
以下是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概念的优势在于它的技术方法——您可以很容易地更改数据库结构。当涉及到数据完整性和方便的数据访问时,自然关键概念是强大的。