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