Domanda

In classe, stiamo tutti "studiando" i database e tutti usano Access. Annoiato da questo, sto provando a fare quello che fa il resto della classe, ma con comandi SQL grezzi con MySQL invece di usare Access.

Sono riuscito a creare database e tabelle, ma ora come posso stabilire una relazione tra due tabelle?

Se ho i miei due tavoli in questo modo:

CREATE TABLE accounts(
    account_id INT NOT NULL AUTO_INCREMENT,
    customer_id INT( 4 ) NOT NULL ,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
    PRIMARY KEY ( account_id )
)

e

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    PRIMARY KEY ( customer_id )
)

Come posso creare una 'relazione' tra le due tabelle? Voglio che ogni account venga "assegnato" a customer_id (per indicare chi lo possiede).

È stato utile?

Soluzione

Se le tabelle sono innodb puoi crearle in questo modo:

CREATE TABLE accounts(
    account_id INT NOT NULL AUTO_INCREMENT,
    customer_id INT( 4 ) NOT NULL ,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
    PRIMARY KEY ( account_id ), 
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 
) ENGINE=INNODB;

Devi specificare che le tabelle sono innodb perché il motore myisam non supporta la chiave esterna. Cerca qui per maggiori informazioni.

Altri suggerimenti

come diceva ehogue, inseriscilo nella tua CREATE TABLE

FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 

in alternativa, se hai già creato la tabella, usa un comando ALTER TABLE:

ALTER TABLE `accounts`
  ADD CONSTRAINT `FK_myKey` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`customer_id`) ON DELETE CASCADE ON UPDATE CASCADE;

Un buon modo per iniziare ad apprendere questi comandi è usare gli Strumenti della GUI di MySQL , che ti dà più "visivo" interfaccia per lavorare con il tuo database. Il vero vantaggio (oltre al metodo di Access) è che dopo aver progettato la tabella tramite la GUI, ti mostra l'SQL che verrà eseguito e quindi puoi imparare da quello.

CREATE TABLE accounts(
    account_id INT NOT NULL AUTO_INCREMENT,
    customer_id INT( 4 ) NOT NULL ,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
    PRIMARY KEY ( account_id )
)

and

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
)

How do I create a 'relationship' between the two tables? I want each account to be 'assigned' one customer_id (to indicate who owns it).

Devi chiederti se si tratta di una relazione 1 a 1 o di una relazione 1 su molti. Cioè, ogni account ha un cliente e ogni cliente ha un account. O ci saranno clienti senza account. La tua domanda implica quest'ultima.

Se si desidera avere una relazione 1: 1 rigorosa, è sufficiente unire le due tabelle.

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)

Nell'altro caso, il modo corretto di creare una relazione tra due tabelle è creare una tabella di relazioni.

CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id)
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}

Quindi, se hai un ID_utente e desideri le informazioni sull'account, ti iscrivi su account e account clienti:

SELECT a.*
    FROM customersaccounts ca
        INNER JOIN accounts a ca.account_id=a.account_id
            AND ca.customer_id=mycustomerid;

A causa dell'indicizzazione questo sarà incredibilmente veloce.

Puoi anche creare una VISTA che ti dà l'effetto della tabella dei conti dei clienti combinati mantenendoli separati

CREATE VIEW customeraccounts AS 
    SELECT a.*, c.* FROM customersaccounts ca
        INNER JOIN accounts a ON ca.account_id=a.account_id
        INNER JOIN customers c ON ca.customer_id=c.customer_id;

Aggiungendo al commento di ehogue, dovresti far corrispondere la dimensione dei tasti su entrambe le tabelle. Invece di

customer_id INT( 4 ) NOT NULL ,

fallo

customer_id INT( 10 ) NOT NULL ,

e assicurati che anche la tua colonna int nella tabella clienti sia int (10).

Alcuni motori MySQL supportano chiavi esterne. Ad esempio, InnoDB può stabilire vincoli basati su chiavi esterne. Se si tenta di eliminare una voce in una tabella con dipendenti in un'altra, l'eliminazione avrà esito negativo.

Se si utilizza un tipo di tabella in MySQL, come MyISAM, che non supporta le chiavi esterne, non si collegano le tabelle ovunque tranne i diagrammi e le query.

Ad esempio, in una query si collegano due tabelle in un'istruzione select con un join:

SELECT a, b from table1 LEFT JOIN table2 USING (common_field);

Ecco un paio di risorse che aiuteranno a iniziare: http: // www. anchor.com.au/hosting/support/CreatingAQuickMySQLRelationalDatabase e http://code.tutsplus.com/articles/sql-for-beginners-part-3-database-relationships--net-8561

Anche come altri hanno detto, usa una GUI: prova a scaricare e installare Xampp (o Wamp) che esegue il software server (Apache e mySQL) sul tuo computer. Quindi quando navighi su // localhost in un browser, seleziona PHPMyAdmin per iniziare a lavorare visivamente con un database mySQL. Come accennato in precedenza, utilizzato innoDB per consentire di stabilire relazioni come richiesto. Rende molto più facile vedere cosa stai facendo con le tabelle del database. Ricorda di interrompere i servizi Apache e mySQL al termine: questi possono aprire le porte che ti possono esporre a minacce di hacking / malware.

Una delle regole che devi sapere è che la colonna della tabella a cui vuoi fare riferimento deve essere con lo stesso tipo di dati di La tabella di riferimento. 2 se decidi di usare mysql devi usare InnoDB Engine perché secondo la tua domanda questo è il motore che supporta ciò che vuoi ottenere in mysql.

Il codice qui sotto è provare anche se le prime persone a rispondere a questa domanda hanno fornito risposte eccellenti al 100% e si prega di considerarle tutte.

CREATE TABLE accounts(
    account_id INT NOT NULL AUTO_INCREMENT,
    customer_id INT( 4 ) NOT NULL ,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
    PRIMARY KEY (account_id)
)ENGINE=InnoDB;

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
     PRIMARY KEY ( account_id ), 
FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 
)ENGINE=InnoDB; 
create table departement(
    dep_id      int primary key auto_increment,
    dep_name    varchar(100) not null,
    dep_descriptin      text,
    dep_photo       varchar(100) not null,
    dep_video       varchar(300) not null
);

create table newsfeeds(
    news_id         int primary key auto_increment,
    news_title      varchar(200) not null,
    news_description    text,
    news_photo          varchar(300) ,
    news_date           varchar(30) not null,
    news_video          varchar(300),
    news_comment        varchar(200),
    news_departement    int foreign key(dep_id) references departement(dep_id)
);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top