SQL复合主键

时间:2015-05-08 21:37:45

标签: sql

我一直在尝试整个下午才能完成这项工作,但是在创建第2,第3和第4个表(那些外键引用第一个表上的复合主键的表)时,它会给我一个错误。它说参考表上没有PK。我用Google搜索,检查了stackoverflow,检查了我的笔记,但仍然不知道为什么它会给我错误。

对不起,代码是西班牙文并提前感谢

create database proyecto_camiones
go
use proyecto_camiones
go

create table servicios (
    ruta int not null,
    nif varchar(9) not null,
    matricula varchar (10) not null,
    fecha date not null
    primary key (ruta, nif, matricula)
    )

create table camiones (
    matricula varchar(10) not null unique references servicios (matricula),
    fecha_alta date not null,
    ultima_inspeccion date not null
    )

create table transportistas (
    nif varchar(9) not null references servicios (nif),
    nombre varchar(30) not null,
    direccion varchar(30) not null,
    fecha_nac date not null
    )

create table rutas (
    codigo int not null unique references servicios (ruta),
    inicio varchar(15) not null,
    final varchar(15) not null
    )

2 个答案:

答案 0 :(得分:1)

由于它是复合主键,因此必须使用PK中包含的所有列。 对于camiones表,它看起来像

create table servicios (
    ruta int not null,
    nif varchar(9) not null,
    matricula varchar (10) not null,
    fecha date not null
    primary key (ruta, nif, matricula)
    )

create table camiones (
    ruta int not null,
    nif varchar(9) not null,
    matricula varchar (10) not null,
    fecha_alta date not null,
    ultima_inspeccion date not null,
    primary key (ruta, nif, matricula),
    FOREIGN KEY (ruta, nif, matricula) REFERENCES servicios(ruta, nif, matricula)
    )

但是,如果您不想存储冗余列(nifmatricula),则可以将PK更改为单独的列id,如下所示

create table servicios (
    id int,
    ruta int not null,
    nif varchar(9) not null,
    matricula varchar (10) not null,
    fecha date not null
    primary key (id)
    )

create table camiones (
    ruta int not null,
    nif varchar(9) not null,
    matricula varchar (10) not null,
    fecha_alta date not null,
    ultima_inspeccion date not null,
    idservicios int,
    primary key (ruta),
    FOREIGN KEY (idservicios) REFERENCES servicios(id)
    )

答案 1 :(得分:0)

可以从“属于不同表”的列列表(不良措辞)形成复合(超级)键(UNIQUE NOT NULL或PRIMARY KEY),而不管其中任何一个参与的FK(外键)。但是复合FK必须引用在表中声明为复合(超)键的列列表。所以错误是因为你的REFERENCES目标表和列没有声明相应的超级键。

所以你可能想要每个基表中的codigo,nif,matricula和外键

FOREIGN KEY (codigo, nif, matricula)
    REFERENCES servicios(ruta, nif, matricula)

您更希望servicios rut​​a,nif和matricula值始终作为值存在于其他三个表的相应列中。 (即你的FK声明方向错误。)

create table servicios (
    ruta int not null,
    nif varchar(9) not null,
    matricula varchar (10) not null,
    fecha date not null
    primary key (ruta, nif, matricula),
    foreign key (ruta) references rutas (codigo),
    foreign key (nif) references transportistas (nif),
    foreign key (matricula) references camiones (matricula)
    )

create table camiones (
    matricula varchar(10) primary key,
    fecha_alta date not null,
    ultima_inspeccion date not null
    )

create table transportistas (
    nif varchar(9) primary key,
    nombre varchar(30) not null,
    direccion varchar(30) not null,
    fecha_nac date not null
    )

create table rutas (
    codigo int primary key,
    inicio varchar(15) not null,
    final varchar(15) not null
    )

但是既然你没有给出你的基础的含义,甚至没有给出输入和输出的示例查询,并且你承认你的代码是错误的,我们只能猜测它是什么。