2016-07-24 10 views
-2

Ich versuche gerade, meinen Kopf um die Idee von Fremdschlüsseln zu wickeln, aber nichts, was ich online gesehen habe, ist so hilfreich, wie ich es brauche.Verwenden von Fremdschlüsseln zum "Synchronisieren" von Mitgliederinformationen

Ich habe eine Datenbank (nennen wir es User_Data). In dieser Datenbank habe ich eine members Tabelle und ich habe eine contact Tabelle. Die Mitglieder-Tabelle enthält die Daten für die E-Mail, den Benutzernamen und die Anmeldung, wobei die Kontaktinformationen den Namen und die Telefonnummer des Benutzers enthalten (und ja, bevor wir darüber sprechen, ob ich Telefonnummern brauche oder nicht).

Also, ich habe so etwas wie dies:

CREATE TABLE `members` (
    `id` int(11) NOT NULL PRIMARY KEY, 
    `username` varchar(30) NOT NULL, 
    `email` varchar(50) NOT NULL, 
    `password` char(128) NOT NULL, 
    `user_type` int(11) NOT NULL DEFAULT '0' 
); 

CREATE TABLE `contact_info` (
    `t_ID` int(11) NOT NULL, 
    `First` varchar(50) DEFAULT NULL, 
    `Last` varchar(50) DEFAULT NULL, 
    `Phone` int(11) DEFAULT NULL 
); 

In der ‚Mitglieder‘ Tabelle, wird der Benutzer mit dem id und in der Kontakttabelle identifiziert die Kontaktinformationen des Benutzers kann durch members.id = contact_info.t_id Vergleich ‚gefunden‘ werden

Von dem, was ich sagen kann, würde ein Fremdschlüssel hier perfekt funktionieren, aber ich kann nicht herausfinden, was genau ich tun muss machen es funktioniert ... oder besser, ich verstehe nicht genug über Fremdschlüssel zu verstehen, was ich tun muss. Die Beziehung zwischen members.id und contact_info.t_id ist eins zu eins ... Ein Benutzer hat nur eine Kontaktgruppe.

Ich lerne SQL, also bin ich hier fast aus meiner Liga, und ich würde jede Hilfe wirklich schätzen.

+0

In diesem Fall, warum nicht die erste, letzte und Telefon als Teil der Mitglieder Tabelle? –

+0

Wenn das alles wäre, was ich tun würde, würde ich das tun ... aber sobald ich bekomme, was oben funktioniert, werden mehrere weitere "Zeilen" zur Kontakt-Tabelle hinzugefügt, und das macht es mir leichter um zu verfolgen, was wo gespeichert ist. –

+0

Ich bin kein MySql-Typ, daher könnte mir etwas fehlen, aber mir scheint, dass [MySql keine Fremdschlüssel-Beschränkungen erzwingt] (http://dev.mysql.com/doc/refman/5.7/en/ example-foreign-keys.html), so dass ich keinen Grund sehe, sie in dieser Datenbank überhaupt zu deklarieren. –

Antwort

0

Tropfen FK bezogenen Tabellen in umgekehrter Reihenfolge:

drop table if exists `contact_info`; 
drop table if exists `members`; 

Schema:

CREATE TABLE `members` (
    `id` int(11) AUTO_INCREMENT PRIMARY KEY, 
    `username` varchar(30) NOT NULL, 
    `email` varchar(50) NOT NULL, 
    `password` char(128) NOT NULL, -- this needs to be bigger. Hashed value. 
    `user_type` int(11) NOT NULL DEFAULT '0' 
) ENGINE=InnoDB; 

CREATE TABLE `contact_info` (
`id` int(11) AUTO_INCREMENT PRIMARY KEY, 
`m_id` int(11) NOT NULL, -- points to `members`.`id` (See Note1 ***) 
    `First` varchar(50) DEFAULT NULL, 
    `Last` varchar(50) DEFAULT NULL, 
    `Phone` int(11) DEFAULT NULL, 
    CONSTRAINT `contact_info_ibfk_1` FOREIGN KEY (`m_id`) REFERENCES `members` (`id`) 
) ENGINE=InnoDB; 

Das Ihr Schema sollte von dem, was ich in Ihrer Frage lese. Es unterstützt 1: 1 und 1: Viele. Nachdem Sie eine Zeile in members eingefügt haben, rufen Sie LAST_INSERT_ID() an, um den Wert AUTO_INCREMENT des Schlüssels zu erhalten, wenn Sie einen Einsatz dort sofort mit einer Einfügung in contact_info verfolgen möchten.

Hinweis1: Wenn Sie 1: 1 wollen, dann brauchen Sie einen eindeutigen Schlüssel (offensichtlich wäre es eine PK). Aber ich denke, du bist immer noch ein wenig verwirrt, 1: 1 oder 1: Viele.

Ein Blick auf sie, nachdem Sie es ausführen:

CREATE TABLE `contact_info` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `m_id` int(11) NOT NULL, 
    `First` varchar(50) DEFAULT NULL, 
    `Last` varchar(50) DEFAULT NULL, 
    `Phone` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `contact_info_ibfk_1` (`m_id`), -- NOTE2 ************ 
    CONSTRAINT `contact_info_ibfk_1` FOREIGN KEY (`m_id`) REFERENCES `members` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

Wenn Sie einen show create table contact_info laufen, so könnte man die oben sehen. Der Schlüssel Note2 (Index) wird automatisch erstellt, damit Sie die Fremdschlüsselbeziehung unterstützen können.

Trotz der Kommentare unter der Frage wird InnoDB die FK-Einschränkung erzwingen. Wenn Sie das nicht glauben, versuchen Sie zunächst, Daten zu contact_info hinzuzufügen.

Bitte beachten Sie die MySQL-Handbuch-Seite mit dem Titel Using FOREIGN KEY Constraints.

Verwandte Themen