it-swarm.com.de

So erstellen Sie Beziehungen in MySQL

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

Es ist mir gelungen, Datenbanken und Tabellen zu erstellen. Wie kann ich nun eine Beziehung zwischen zwei Tabellen herstellen?

Wenn ich meine zwei Tische 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,
)

Wie erstelle ich eine 'Beziehung' zwischen den beiden Tabellen? Ich möchte, dass jedem Konto eine customer_id zugewiesen wird (um anzugeben, wer das Konto besitzt).

83
Josh Hunt

Wenn die Tabellen nicht vorhanden sind, können Sie es folgendermaßen 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. Schauen Sie hier für weitere Informationen. 

89
Eric Hogue

wie ehogue sagte, lege dies in deine CREATE TABLE

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;

Ein guter Einstieg in das Erlernen dieser Befehle ist die Verwendung der MySQL GUI-Tools , die Ihnen eine "visuellere" Schnittstelle für die Arbeit mit Ihrer Datenbank bieten. Der eigentliche Vorteil (gegenüber der Access-Methode) besteht darin, dass Sie nach dem Entwerfen Ihrer Tabelle über die grafische Benutzeroberfläche die SQL anzeigen, die ausgeführt werden soll. Daher können Sie davon lernen.

71
nickf
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 zu 1 Beziehung oder eine 1 aus vielen Beziehungen ist. Hat also jedes Konto einen Kunden und jeder Kunde ein Konto? Oder wird es Kunden ohne Konten geben? Ihre Frage impliziert das letztere.

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 ist der korrekte Weg zum Erstellen einer Beziehung zwischen zwei Tabellen das Erstellen einer Beziehungstabelle.

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 wünschen, nehmen Sie an Kundenaccounts und Konten teil:

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 Ihnen die Wirkung der kombinierten Kundenaccounts-Tabelle gibt, 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;
11
user3842431

Wenn Sie den Kommentar von ehogue hinzufügen, 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. 

9
Zak

Bestimmte MySQL-Engines unterstützen Fremdschlüssel. InnoDB kann zum Beispiel Einschränkungen basierend auf Fremdschlüsseln festlegen. Wenn Sie versuchen, einen Eintrag in einer Tabelle zu löschen, der untergeordnete Elemente in einer anderen Tabelle hat, schlägt das Löschen fehl.

Wenn Sie in MySQL einen Tabellentyp verwenden, z. B. MyISAM, 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);
6
Gary Richardson

Hier sind ein paar Ressourcen, die Ihnen beim Einstieg helfen werden: http://www.anchor.com.au/hosting/support/CreatingAQuickMySQLRelationalDatabase und http://code.tutsplus.com/articles/sql- für Anfänger-Teil-3-Datenbank-Beziehungen - net-8561

Verwenden Sie auch eine GUI - versuchen Sie, Xampp (oder Wamp) herunterzuladen und zu installieren, auf dem Server-Software (Apache und mySQL) auf Ihrem Computer ausgeführt wird. Wenn Sie 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 mit innoDB die Möglichkeit, Beziehungen wie gewünscht zu erstellen. Dadurch wird es einfacher zu sehen, was Sie mit den Datenbanktabellen tun. Denken Sie daran, die Apache- und MySQL-Dienste zu stoppen, wenn Sie fertig sind. Dadurch können Sie Ports öffnen, die Sie vor Hackern/bösartigen Bedrohungen schützen können.

2
user3659515

Eine der Regeln, die Sie beachten müssen, ist, dass die Tabellenspalte, auf die Sie verweisen möchten, denselben Datentyp haben muss wie Die Verweistabelle. 2 Wenn Sie sich für die Verwendung von Mysql entscheiden, müssen Sie die InnoDB Engine verwenden, da dies Ihrer Frage nach die Engine ist, die das unterstützt, was Sie mit Mysql erreichen möchten.

Bellow ist der Code, probieren Sie es aus, obwohl die ersten Personen, die diese Frage beantworten, zu 100% großartige Antworten gegeben haben. Bitte berücksichtigen Sie sie alle.

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; 
1
Musa
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)
);
0
Anayat