Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,315

    [delphi] Prymary Key su IBTabella

    Ciao

    ho questa tabella con una PRIMARY KEY su due Fields della IBtabella.
    codice:
    CREATE TABLE MOVIMENTI (
        ID_ANNO            CHAR(4) NOT NULL,
        ID_MOVIMENTI       CHAR(8) NOT NULL,
        DATA               DATE,
        CLIENTE            VARCHAR(8) NOT NULL REFERENCES CLIENTI,
        PRIMARY KEY (ID_ANNO, ID_MOVIMENTI));
    poi ho una seconda tabella movimenti_dettagli
    codice:
    CREATE TABLE MOVIMENTI_DETTAGLIO (
        ID_MOVIMENTI       CHAR(12)  NOT NULL REFERENCES MOVIMENTI (id_anno,ID_MOVIMENTI),
        ARTICOLO           VARCHAR(15) NOT NULL REFERENCES ARTICOLI (CODICE),
        QUANTITA           NUMERIC(9,3),
        PREZZO             NUMERIC(9,3),
        IVA                NUMERIC(5,2),    
        SCONTO             NUMERIC(6,2));

    ma non riesco a creare la referenza tra il campo ID_MOVIMENTI della seconda tabella con la chiave primaria dellatabella movimenti.

    REFERENCES MOVIMENTI (id_anno,ID_MOVIMENTI)
    va in errore in creazione:


    This operation is not defined for system tables.
    Dynamic SQL Error.
    SQL error code = -607.
    Invalid command.
    FOREIGN KEY column count does not match PRIMARY KEY.


    ciao e grazie

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,322
    Stai cercando di mettere in relazione una colonna con due colonne in una tabella esterna.

    Per stabilire una relazione tra due tabelle usando due colonne, la condizione deve essere valida in entrambe i casi.

    Mi spiego, non puoi relazionare tra di loro IDMOVIMENTO nella tabella secondaria (un campo) con IDANNO e IDMOVIMENTO della prima: si tratta di un campo messo in relazione con due e non è logicamente tollerabile.

    Se usi due campi per costruire la chiave primaria, i record correlati nelle tabelle secondarie dovranno essere collegati a quelli della tabella primaria usando due campi.

    Se hai creato una chiave primaria basata su IDANNO e IDMOVIMENTO, significa che ogni record nella tabella primaria è identificato da questa coppia di campi, pertanto non puoi collegare una tabella secondaria solo al campo IDMOVIMENTO, poichè considerando unicamente quel campo puoi avere due record con lo stesso valore all'interno della tabella primaria, tra le altre cose.

    In definitiva, se identifichi i record della tabella A con due campi, devi usare nella tabella B due campi per riferirti ad un record memorizzato nella tabella A.

    E' per questo motivo che, in genere, io preferisco creare sempre e comunque un campo ID autoincrementale (tramite generatore) da usare come chiave primaria per collegare tra loro i record; in questo modo, mi basta solo un campo per stabilire la relazione, il campo è senz'altro differente poichè generato e incrementato dal server e, soprattutto, si tratta di un campo intero molto rapido se impiegato in ricerche, piuttosto che uno o più campi alfanumerici che vanno confrontati interamente.

    Spero di averti spiegato esaustivamente il concetto.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.