2017-12-26 9 views
0

Ich habe keine Ahnung, warum ich eine Fehlermeldung erhalten, wenn die foreing Schlüssel in MariaDB setzenIch habe keine Ahnung, warum ich eine Fehlermeldung erhalten, wenn die foreing Schlüssel in MariaDB setzen

ich die volle Datenbank löschen, wenn es

existiert
drop database if exists proveedoresCarrito; 
create database proveedoresCarrito; 
use proveedoresCarrito; 

Und jetzt werde ich die Tabellen

CREATE TABLE INVENTARIO (
NUMPIEZA CHAR(16) NOT NULL, 
NUMBIN SMALLINT NOT NULL, 
CANTDISPONIBLE SMALLINT, 
FECHARECUENTO DATE, 
PERIODORECUEN SMALLINT, 
CANTAJUSTE SMALLINT, 
CARTREORD SMALLINT, 
PUNTOREORD SMALLINT); 


CREATE TABLE LINPED (
NUMPEDIDO SMALLINT NOT NULL, 
NUMLINEA SMALLINT NOT NULL, 
NUMPIEZA CHAR(16), 
PRECIOCOMPRA INTEGER, 
CANTPEDIDA SMALLINT, 
FECHARECEP DATE, 
CANTRECIBIDA SMALLINT); 


CREATE TABLE PEDIDO (
NUMPEDIDO SMALLINT NOT NULL, 
NUMVEND SMALLINT, 
FECHA DATE); 


CREATE TABLE PIEZA (
NUMPIEZA CHAR(16) NOT NULL, 
NOMPIEZA CHAR(30), 
PRECIOVENT INTEGER); 


CREATE TABLE PRECIOSUM (
NUMPIEZA CHAR(16) NOT NULL, 
NUMVEND SMALLINT NOT NULL, 
PRECIOUNIT INTEGER, 
DIASSUM SMALLINT, 
DESCUENTO SMALLINT); 


CREATE TABLE VENDEDOR (
NUMVEND SMALLINT NOT NULL, 
NOMVEND CHAR(30), 
NOMBRECOMER CHAR(30), 
TELEFONO CHAR(15), 
CALLE CHAR(30), 
CIUDAD CHAR(20), 
PROVINCIA CHAR(20), 
COD_POSTAL CHAR(5)); 

create table usuarios(
nombre SMALLINT NOT NULL, 
pass CHAR(15) 
); 

ich die Primärschlüssel einrichten erstellen

ALTER TABLE INVENTARIO ADD CONSTRAINT CP_INVENTARIO PRIMARY KEY (NUMBIN); 
ALTER TABLE LINPED ADD CONSTRAINT CP_LINPED PRIMARY KEY (NUMPEDIDO, NUMLINEA); 
ALTER TABLE PEDIDO ADD CONSTRAINT CP_PEDIDO PRIMARY KEY (NUMPEDIDO); 
ALTER TABLE PIEZA ADD CONSTRAINT CP_PIEZA PRIMARY KEY (NUMPIEZA); 
ALTER TABLE PRECIOSUM ADD CONSTRAINT CP_PRECIOSUM PRIMARY KEY (NUMPIEZA, NUMVEND); 
ALTER TABLE VENDEDOR ADD CONSTRAINT CP_VENDEDOR PRIMARY KEY (NUMVEND); 

UND ENDLICH habe ich die Fremdschlüssel bis

ALTER TABLE INVENTARIO ADD CONSTRAINT CP_INVENTARIO PRIMARY KEY (NUMBIN); 
ALTER TABLE LINPED ADD CONSTRAINT CP_LINPED PRIMARY KEY (NUMPEDIDO, NUMLINEA); 
ALTER TABLE PEDIDO ADD CONSTRAINT CP_PEDIDO PRIMARY KEY (NUMPEDIDO); 
ALTER TABLE PIEZA ADD CONSTRAINT CP_PIEZA PRIMARY KEY (NUMPIEZA); 
ALTER TABLE PRECIOSUM ADD CONSTRAINT CP_PRECIOSUM PRIMARY KEY (NUMPIEZA, NUMVEND); 
ALTER TABLE VENDEDOR ADD CONSTRAINT CP_VENDEDOR PRIMARY KEY (NUMVEND); 
ALTER TABLE usuarios ADD CONSTRAINT CA_VENDEDOR_USUARIOS_NOMBRE FOREIGN KEY (nombre) REFERENCES VENDEDOR(NUMVEND); 
ALTER TABLE usuarios ADD CONSTRAINT CA_VENDEDOR_USUARIOS_PASS FOREIGN KEY (pass) REFERENCES VENDEDOR(TELEFONO); 

jedoch alle Fremdschlüssel korrekt funktionieren mit Ausnahme der letzten beiden , wenn ich das SQL-Skript ausführen bekomme ich diesen Fehler:

Fehler de SQL (1822): Konnte den Fremdschlüssel nicht hinzufügen. Fehlende Index für Einschränkung ‚CA_VENDEDOR_USUARIOS_PASS‘ in der referenzierten Tabelle ‚anzeigen‘

wenn ich die letzten zwei Fremdschlüssel fallen der Fehler verschwindet

mir jemand eine Lösung geben kann?

Antwort

0

Schauen Sie sich genau Ihren "Fremdschlüssel einrichten" -Code an. Es erstellt wieder Primärschlüssel (außer den zwei letzten Zeilen).

Tabelle usuarios scheint keinen Primärschlüssel zu haben.

ALTER TABLE usuarios ADD CONSTRAINT CP_usuarios PRIMARY KEY (nombre); 

die ersten 6 Zeilen löschen und nur diese

ALTER TABLE usuarios ADD CONSTRAINT CA_VENDEDOR_USUARIOS_NOMBRE 
    FOREIGN KEY (nombre) 
    REFERENCES VENDEDOR(NUMVEND); 
ALTER TABLE usuarios ADD CONSTRAINT CA_VENDEDOR_USUARIOS_PASS 
    FOREIGN KEY (pass) 
    REFERENCES VENDEDOR(TELEFONO); 

auch (und das ist, was Ihr Fehler erzeugt) halten, versuchen Sie VENDEDOR(TELEFONO) einen Fremdschlüssel zu einer Spalte hinzuzufügen, die nicht a Primärschlüssel noch hat eine UNIQUE-Einschränkung.

Laut Microsoft:

A foreign key constraint does not have to be linked only to a primary key constraint in another table; it can also be defined to reference the columns of a UNIQUE constraint in another table.

See: Create Foreign Key Relationships

diese hinzufügen, bevor Sie die Fremdschlüssel zu erstellen:

ALTER TABLE VENDEDOR ADD CONSTRAINT UX_telefono UNIQUE (TELEFONO); 
+0

Vielen Dank! es ist unmöglich, einen Fremdschlüssel zu setzen, der nicht auf einen Primärschlüssel verweist, aber ich möchte nicht ALTER TABLE VENDEDOR ADD CONSTRAINT UX_telefono UNIQUE (TELEFONO); Weil dieses Feld in der Lage sein muss, sich zu wiederholen, gibt es eine Alternative zu Foreign Key? – Daniel

+0

Fügen Sie dem Primärschlüssel des Anbieters, auf dessen Telefonnummer verwiesen wird, einen Fremdschlüssel hinzu. I.e.Ersetzen Sie die Spalte "pass" durch die Spalte "pass_vendor_id". Dann suchen Sie die Telefonnummer im Anbieter, wenn Sie es brauchen. Auf diese Weise ist es normalisierter, da Sie die Telefonnummer nicht wiederholen. –

+0

Aber wie kann ich nachschlagen und die Telefonnummer wie ein Passwort ohne Fremdschlüssel verwenden? – Daniel

0

Ein Fremdschlüssel hat immer einen Primärschlüssel zu verweisen.

Um die Tabelle VENDEDOR zu referenzieren, sollten Sie die Spalten verwenden, aus denen die PK besteht. In diesem Beispiel NUMVEND.

Wenn Sie irgendwelche Vorschläge benötigen, was zu tun ist, würde ich wissen müssen, was Ihre Absichten in dieser DB-Struktur sind.

Verwandte Themen