Cara membuat hubungan di MySQL

96

Di kelas, kita semua 'mempelajari' database, dan semua orang menggunakan Access. Bosan dengan ini, saya mencoba melakukan apa yang dilakukan kelas lainnya, tetapi dengan perintah SQL mentah dengan MySQL daripada menggunakan Access.

Saya telah berhasil membuat database dan tabel, tetapi sekarang bagaimana cara membuat hubungan antara dua tabel?

Jika saya memiliki dua tabel saya seperti ini:

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

dan

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

Bagaimana cara membuat 'hubungan' antara dua tabel? Saya ingin setiap akun 'ditetapkan' satu customer_id (untuk menunjukkan siapa pemiliknya).

Josh Hunt
sumber
48
"SAYA MENOLAK untuk mempelajari Access, saya akan mempelajari mesin database NYATA: MySQL" Itulah semangat! Selamat = D
Metafaniel
2
Perhatikan bahwa batasan kunci asing tidak mengimplementasikan hubungan, mereka mengimplementasikan integritas. Kaitan antara account_id dan customer_id di tabel akun mengimplementasikan hubungan antara entitas masing-masing.
reaanb
1
"Itu semangatnya!", Selama itu mysql dengan InnoDB, bukan MyISAM. Postgreqsl juga memiliki beberapa fitur menarik di MySQL yang layak untuk dilihat.
jgmjgm

Jawaban:

102

Jika tabelnya innodb Anda bisa membuatnya seperti ini:

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;

Anda harus menentukan bahwa tabel adalah innodb karena mesin myisam tidak mendukung kunci asing. Lihat di sini untuk info lebih lanjut.

Eric Hogue
sumber
Saya melihat di sebuah artikel, bahwa tidak perlu menentukan klausa ENGINE = InnoDB jika InnoDB didefinisikan sebagai mesin penyimpanan default, dapat memeriksa menggunakan perintah (mysql> SELECT @@ default_storage_engine;)
Arun
80

seperti yang dikatakan ehogue, taruh ini di CREATE TABLE Anda

FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 

alternatifnya, jika Anda sudah membuat tabel, gunakan perintah ALTER TABLE:

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

Salah satu cara yang baik untuk mulai mempelajari perintah-perintah ini adalah dengan menggunakan MySQL GUI Tools , yang memberikan Anda lebih banyak antarmuka "visual" untuk bekerja dengan database Anda. Manfaat nyata untuk itu (atas metode Access), adalah bahwa setelah mendesain tabel Anda melalui GUI, ini menunjukkan kepada Anda SQL yang akan dijalankannya, dan karenanya Anda dapat belajar darinya.

nickf
sumber
3
Jawaban Anda adalah solusi terbaik
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).

Anda harus bertanya pada diri sendiri apakah ini hubungan 1 banding 1 atau hubungan 1 dari banyak. Artinya, apakah setiap akun memiliki pelanggan dan setiap pelanggan memiliki akun. Atau akan ada pelanggan tanpa akun. Pertanyaan Anda menyiratkan yang terakhir.

Jika Anda ingin memiliki hubungan 1 ke 1 yang ketat, cukup gabungkan kedua tabel tersebut.

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

Dalam kasus lain, cara yang benar untuk membuat hubungan antara dua tabel adalah dengan membuat tabel hubungan.

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
}

Kemudian, jika Anda memiliki customer_id dan menginginkan info akun, Anda bergabung dengan akun dan akun pelanggan:

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

Karena pengindeksan, ini akan menjadi sangat cepat.

Anda juga dapat membuat TAMPILAN yang memberi Anda efek tabel akun pelanggan gabungan sambil memisahkannya

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;
pengguna3842431
sumber
1
Saya pikir Anda ca.tidak bermaksud ac.(3 tempat).
Tampilan elips
Anda menulis PRIMARY KEY (customer_id, account_id)tanpa koma setelahnya
theonlygusti
11

Menambahkan ke komentar oleh ehogue, Anda harus membuat ukuran tombol pada kedua tabel cocok. Daripada

customer_id INT( 4 ) NOT NULL ,

buat itu

customer_id INT( 10 ) NOT NULL ,

dan pastikan kolom int Anda di tabel pelanggan juga int (10).

Zak
sumber
7

Mesin MySQL tertentu mendukung kunci asing. Misalnya, InnoDB dapat membuat batasan berdasarkan kunci asing. Jika Anda mencoba untuk menghapus entri dalam satu tabel yang memiliki ketergantungan di tabel lain, penghapusan akan gagal.

Jika Anda menggunakan tipe tabel di MySQL, seperti MyISAM, yang tidak mendukung kunci asing, Anda tidak dapat menautkan tabel di mana pun kecuali diagram dan kueri Anda.

Misalnya, dalam kueri Anda menautkan dua tabel dalam pernyataan pilih dengan gabungan:

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

Berikut adalah beberapa sumber daya yang akan membantu memulai: http://www.anchor.com.au/hosting/support/CreatingAQuickMySQLRelationalDatabase dan http://code.tutsplus.com/articles/sql-for-beginners-part- Hubungan-3-database - net-8561

Juga seperti yang dikatakan orang lain, gunakan GUI - coba unduh dan instal Xampp (atau Wamp) yang menjalankan perangkat lunak server (Apache dan mySQL) di komputer Anda. Kemudian ketika Anda menavigasi ke // localhost di browser, pilih PHPMyAdmin untuk mulai bekerja dengan database mySQL secara visual. Seperti disebutkan di atas, innoDB digunakan untuk memungkinkan Anda membuat hubungan seperti yang Anda minta. Menjadikannya lebih mudah untuk melihat apa yang Anda lakukan dengan tabel database. Ingatlah untuk MENGHENTIKAN layanan Apache dan mySQL setelah selesai - ini dapat membuka port yang dapat membuat Anda terkena peretasan / ancaman berbahaya.

user3659515
sumber
Jika Anda mengatur apache dan mysql untuk hanya melayani permintaan lokal maka Anda tidak perlu menghentikannya. Selain itu, pengguna setidaknya harus menginstal firewall perangkat lunak jika menginstal layanan semacam ini. Dengan demikian, banyak router rumah dilengkapi dengan firewall yang terpasang di dalamnya sehingga port tidak boleh dibuka kecuali jika telah dibuka oleh seseorang yang memiliki akses ke router.
Chris
1

Salah satu aturan yang harus Anda ketahui adalah bahwa kolom tabel yang ingin Anda rujuk harus dengan tipe data yang sama dengan tabel referensi. 2 jika Anda memutuskan untuk menggunakan mysql Anda harus menggunakan InnoDB Engine karena menurut pertanyaan Anda itulah mesin yang mendukung apa yang ingin Anda capai di mysql.

Di bawah ini adalah kodenya mencobanya meskipun orang pertama yang menjawab pertanyaan ini mereka 100% memberikan jawaban yang bagus dan mohon pertimbangkan semuanya.

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
sumber
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
sumber
Berikan beberapa penjelasan tentang skema yang Anda berikan.
samabcde