So erstellen Sie Beziehungen in MySQL

96

Im Unterricht "studieren" wir alle Datenbanken und jeder nutzt Access. Gelangweilt versuche ich, das zu tun, was der Rest der Klasse tut, aber mit rohen SQL-Befehlen mit MySQL, anstatt Access zu verwenden.

Ich habe es geschafft, Datenbanken und Tabellen zu erstellen, aber wie kann ich nun eine Beziehung zwischen zwei Tabellen herstellen?

Wenn ich meine zwei Tabellen so habe:

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

und

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

Wie erstelle ich eine Beziehung zwischen den beiden Tabellen? Ich möchte, dass jedem Konto eine Kunden-ID zugewiesen wird (um anzugeben, wem es gehört).

Josh Hunt
quelle
48
"Ich lehne es ab, Access zu studieren, ich werde eine echte Datenbank-Engine studieren: MySQL" Das ist der Geist! Herzlichen Glückwunsch = D
Metafaniel
2
Beachten Sie, dass Fremdschlüsseleinschränkungen keine Beziehungen implementieren, sondern Integrität implementieren. Die Zuordnung zwischen account_id und customer_id in der Accounts-Tabelle implementiert die Beziehung zwischen den jeweiligen Entitäten.
Reaanb
1
"Das ist der Geist!", Solange es MySQL mit InnoDB ist, nicht MyISAM. Auch postgreqsl hat einige interessante Funktionen über MySQL, die einen Blick wert sind.
jgmjgm

Antworten:

102

Wenn die Tabellen innodb sind, können Sie sie wie folgt erstellen:

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;

Sie müssen angeben, dass die Tabellen innodb sind, da die myisam-Engine keinen Fremdschlüssel unterstützt. Weitere Informationen finden Sie hier .

Eric Hogue
quelle
Ich habe in einem Artikel gesehen, dass keine Notwendigkeit besteht, die ENGINE = InnoDB-Klausel anzugeben, wenn InnoDB als Standardspeicher-Engine definiert ist. Dies kann mit dem Befehl (mysql> SELECT @@ default_storage_engine;) überprüft werden
Arun
80

Wie Ehogue sagte, tragen Sie dies in Ihre CREATE TABLE ein

FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 

Wenn Sie die Tabelle bereits erstellt haben, verwenden Sie alternativ den Befehl ALTER TABLE:

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

Eine gute Möglichkeit, diese Befehle zu erlernen, ist die Verwendung der MySQL-GUI-Tools , die Ihnen eine "visuellere" Oberfläche für die Arbeit mit Ihrer Datenbank bieten. Der eigentliche Vorteil (gegenüber der Access-Methode) besteht darin, dass nach dem Entwerfen Ihrer Tabelle über die GUI die SQL angezeigt wird, die ausgeführt werden soll, und Sie daraus lernen können.

nickf
quelle
3
Ihre Antwort ist die beste Lösung
Omar
14
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).

Sie müssen sich fragen, ob dies eine 1: 1-Beziehung oder eine 1 von vielen Beziehungen ist. Das heißt, hat jedes Konto einen Kunden und jeder Kunde hat ein Konto. Oder wird es Kunden ohne Konten geben? Ihre Frage impliziert letzteres.

Wenn Sie eine strikte 1: 1-Beziehung haben möchten, führen Sie einfach die beiden Tabellen zusammen.

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,
)

Im anderen Fall besteht die richtige Methode zum Erstellen einer Beziehung zwischen zwei Tabellen darin, eine Beziehungstabelle zu erstellen.

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
}

Wenn Sie dann eine customer_id haben und die Kontoinformationen möchten, schließen Sie sich Kundenkonten und Konten an:

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

Aufgrund der Indizierung ist dies unglaublich schnell.

Sie können auch eine ANSICHT erstellen, die den Effekt der kombinierten Kundenkonten-Tabelle zeigt, während diese getrennt bleiben

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;
user3842431
quelle
1
Ich denke du meintest ca.nicht ac.(3 Plätze).
Elliptische Ansicht
Sie haben PRIMARY KEY (customer_id, account_id)ohne Komma danach geschrieben
theonlygusti
11

Wenn Sie den Kommentar von ehogue ergänzen, sollten Sie die Größe der Schlüssel in beiden Tabellen anpassen. Eher, als

customer_id INT( 4 ) NOT NULL ,

mach es

customer_id INT( 10 ) NOT NULL ,

und stellen Sie sicher, dass Ihre int-Spalte in der Kundentabelle auch int (10) ist.

Zak
quelle
7

Bestimmte MySQL-Engines unterstützen Fremdschlüssel. InnoDB kann beispielsweise Einschränkungen basierend auf Fremdschlüsseln festlegen. Wenn Sie versuchen, einen Eintrag in einer Tabelle zu löschen, der Abhängige in einer anderen Tabelle enthält, schlägt das Löschen fehl.

Wenn Sie in MySQL einen Tabellentyp wie MyISAM verwenden, der keine Fremdschlüssel unterstützt, verknüpfen Sie die Tabellen nur mit Ihren Diagrammen und Abfragen.

In einer Abfrage verknüpfen Sie beispielsweise zwei Tabellen in einer select-Anweisung mit einem Join:

SELECT a, b from table1 LEFT JOIN table2 USING (common_field);
Gary Richardson
quelle
2

Im Folgenden finden Sie einige Ressourcen, die Ihnen den Einstieg erleichtern: http://www.anchor.com.au/hosting/support/CreatingAQuickMySQLRelationalDatabase und http://code.tutsplus.com/articles/sql-for-beginners-part- 3-Datenbank-Beziehungen - net-8561

Verwenden Sie auch, wie andere sagten, eine grafische Benutzeroberfläche. Versuchen Sie, Xampp (oder Wamp) herunterzuladen und zu installieren, auf dem Server-Software (Apache und mySQL) auf Ihrem Computer ausgeführt wird. Wenn Sie dann in einem Browser zu // localhost navigieren, wählen Sie PHPMyAdmin aus, um visuell mit einer mySQL-Datenbank zu arbeiten. Wie oben erwähnt, haben Sie innoDB verwendet, damit Sie die gewünschten Beziehungen herstellen können. Erleichtert das Anzeigen, was Sie mit den Datenbanktabellen tun. Denken Sie daran, Apache- und mySQL-Dienste zu beenden, wenn Sie fertig sind. Diese können Ports öffnen, die Sie Hacking / böswilligen Bedrohungen aussetzen können.

user3659515
quelle
Wenn Sie Apache und MySQL so einrichten, dass nur lokale Anforderungen bearbeitet werden, müssen Sie diese nicht stoppen. Außerdem sollten Benutzer mindestens eine Software-Firewall installiert haben, wenn sie diese Art von Diensten installieren. Trotzdem verfügen viele Heimrouter über eine integrierte Firewall, sodass die Ports ohnehin nicht geöffnet sein sollten, es sei denn, sie wurden von jemandem geöffnet, der Zugriff auf den Router hat.
Chris
1

Eine der Regeln, die Sie kennen müssen, ist, dass die Tabellenspalte, auf die Sie verweisen möchten, denselben Datentyp wie die referenzierende Tabelle haben muss. 2 Wenn Sie sich für MySQL entscheiden, müssen Sie InnoDB Engine verwenden, da dies Ihrer Frage nach die Engine ist, die unterstützt, was Sie in MySQL erreichen möchten.

Unten ist der Code, versuchen Sie es, obwohl die ersten Leute, die diese Frage beantworteten, zu 100% großartige Antworten gaben und bitte alle berücksichtigen.

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; 
Musa
quelle
0
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)
);
Anayat
quelle
Bitte erläutern Sie das von Ihnen angegebene Schema.
Samabcde