Jak tworzyć relacje w MySQL

W klasie wszyscy "studiujemy" bazy danych i wszyscy korzystają z dostępu. Znudzony tym, staram się robić to, co robi reszta klasy, ale z surowymi poleceniami SQL z MySQL zamiast używać Access.

Udało mi się stworzyć bazy danych i tabele, ale jak teraz stworzyć relację między dwiema tabelami?

Jeśli mam swoje dwa stoły takie:

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

I

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

Jak stworzyć "relację" między dwoma tabelami? Chcę, aby każde konto być "przypisany" jeden customer_id (aby wskazać, kto jest właścicielem).

Author: aneroid, 2008-11-04

8 answers

Jeśli tabele są innodb, możesz utworzyć je w następujący sposób:

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;

Musisz określić, że tabele są innodb, ponieważ MyISAM engine nie obsługuje klucza obcego. Zobacz tutaj aby uzyskać więcej informacji.

 86
Author: Eric Hogue,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-04 00:32:48

Jak powiedział ehogue, umieść to w swojej tabeli Utwórz

FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 

Alternatywnie, jeśli masz już utworzoną tabelę, użyj polecenia ALTER TABLE:

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

Dobrym sposobem na rozpoczęcie nauki tych poleceń jest użycie MySQL GUI Tools , które zapewniają bardziej "wizualny" interfejs do pracy z bazą danych. Realną korzyścią z tego (nad metodą Access) jest to, że po zaprojektowaniu tabeli za pomocą GUI pokazuje on SQL, który będzie uruchamiany, a zatem możesz uczyć się od to.

 68
Author: nickf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-04 00:37:52
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).

Musisz zadać sobie pytanie, czy to związek 1 do 1, Czy 1 z wielu związków. Oznacza to, że każde konto ma Klienta i każdy klient ma konto. Albo będą klienci bez kont. Twoje pytanie sugeruje to drugie.

Jeśli chcesz mieć ścisłą relację 1 do 1, po prostu połącz dwie tabele.

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

W drugim przypadku prawidłowym sposobem tworzenia relacji między dwoma tabelami jest stworzenie relacji stolik.

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
}

Następnie, jeśli masz customer_id i chcesz uzyskać informacje o koncie, dołączasz do customersaccounts i kont:

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

Z powodu indeksowania będzie to ślepo szybkie.

Można również utworzyć widok, który daje efekt połączonej tabeli customersaccounts, zachowując je oddzielnie

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
Author: user3842431,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-31 19:20:36

Dodając do komentarza ehogue, powinieneś dopasować rozmiar klawiszy na obu stołach. Zamiast

customer_id INT( 4 ) NOT NULL ,

Make it

customer_id INT( 10 ) NOT NULL ,

I upewnij się, że Twoja kolumna int w tabeli klientów również jest int(10).

 9
Author: Zak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-04 00:36:10

Niektóre silniki MySQL obsługują klucze obce. Na przykład InnoDB może ustanawiać ograniczenia na podstawie kluczy obcych. Jeśli spróbujesz usunąć wpis w jednej tabeli, który ma zależności w innej, usunięcie nie powiedzie się.

Jeśli używasz typu tabeli w MySQL, takiego jak MyISAM, który nie obsługuje kluczy obcych, nie łączysz tabel nigdzie poza diagramami i zapytaniami.

Na przykład w zapytaniu łączysz dwie tabele w instrukcji select za pomocą join:

SELECT a, b from table1 LEFT JOIN table2 USING (common_field);
 6
Author: Gary Richardson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-04 01:02:30

Oto kilka zasobów, które pomogą zacząć: http://www.anchor.com.au/hosting/support/CreatingAQuickMySQLRelationalDatabase oraz http://code.tutsplus.com/articles/sql-for-beginners-part-3-database-relationships--net-8561

Również jak inni powiedzieli, użyj GUI-spróbuj pobrać i zainstalować Xampp (lub Wamp), które uruchamiają oprogramowanie serwerowe (Apache i mySQL) na twoim komputerze. Następnie po przejściu do //localhost w przeglądarce Wybierz PHPMyAdmin, aby rozpocząć wizualnie praca z bazą danych mySQL. Jak wspomniano powyżej, użyto innoDB, aby umożliwić nawiązywanie relacji zgodnie z żądaniem. Sprawia, że łatwiej jest zobaczyć, co robisz z tabelami bazy danych. Pamiętaj tylko, aby zatrzymać usługi Apache i mySQL po zakończeniu - mogą one otworzyć porty, które mogą narazić Cię na hakowanie / złośliwe zagrożenia.

 2
Author: user3659515,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-21 06:37:34

Jedną z reguł, które musisz znać, jest to, że kolumna tabeli, do której chcesz się odwołać, musi mieć ten sam typ danych, co Tabela odniesienia . 2 jeśli zdecydujesz się użyć mysql musisz użyć InnoDB Engine ponieważ zgodnie z twoim pytaniem jest to silnik który obsługuje to co chcesz osiągnąć w mysql .

Poniżej znajduje się kod spróbuj go choć pierwsze osoby, które odpowiedzą na to pytanie oni 100% dostarczył świetne odpowiedzi i proszę rozważyć je wszystkie .

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
Author: Musa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-26 10:47:04
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
Author: Anayat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-16 05:32:11