2015-05-08 3 views
1

Я пробовал весь день, чтобы выполнить эту работу, но это дает мне ошибку при создании 2-й, 3-й и 4-й таблиц (с внешними ключами, ссылающимися на составной первичный ключ в первой таблице) , В нем говорится, что в таблице, на которую указана ссылка, нет ПК. Я googled, проверил stackoverflow, проверил мои заметки и до сих пор не знаю, почему это дает мне ошибку.Первичный ключ SQL-кода

К сожалению код на испанском языке и заранее спасибо

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 
    ) 
+0

Внешний ключ должен состоять из 3 столбцов, чтобы соответствовать первичным ключам. –

+0

, так что в принципе я не могу сформировать составной ПК из столбцов, принадлежащих к разным таблицам? Я имею в виду, что все они должны принадлежать одному и тому же столу? спасибо –

+0

Да, вы должны включить * все столбцы * PK в таблицу ссылок. –

ответ

1

Поскольку составной первичный ключ, который вы должны использовать все столбцы, включенные в ПК. Для 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) 
    ) 

Но если вы не хотите хранить redundad столбцы (nif, matricula) вы можете изменить ПК к одной отдельной колонке 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) 
    ) 
+0

, так что в принципе я не могу сформировать Композитный ПК из столбцов, принадлежащих разным таблицам? Я имею в виду, что все они должны принадлежать одному и тому же столу? спасибо –

+0

@ArturAlvaro Нет, вы не можете. – Parado

+0

все в порядке, спасибо !! –

0

можно сформируйте составной (супер) ключ (UNIQUE NOT NULL или PRIMARY KEY) из списка столбцов «принадлежащих к разным таблицам» (плохая фраза) независимо от любых FK (внешних ключей), в которые участвует кто-либо из них. Но составной FK должен ссылаться на список столбцов, объявленный как составной (супер) ke y в таблице. Таким образом, ошибка связана с тем, что целевые таблицы и столбцы REFERENCES не имеют объявленных соответствующих суперклассов.

Так, возможно, вы хотите Codigo, NIF, Matricula в каждой базовой таблице и внешних ключах, чтобы быть

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

Более вероятно, что вы хотите Servicios руты, НИФ и 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 
    ) 

Но так как вы не дали смысл ваших баз или даже пример запроса с вводом и выводом, и вы признаете, что ваш код не так, мы можем только угадайте, какое это право.

Смежные вопросы