phpMyAdmin
 sql >> Teknologi Basis Data >  >> Database Tools >> phpMyAdmin

Cara mengatur hubungan antar tabel Di phpMyAdmin

Batasan kunci asing table2 berarti bahwa setiap nilai table2 customerId harus muncul sebagai customerId di table1. Anda mendapatkan kesalahan karena Anda memasukkan ID pelanggan ke table2 yang tidak muncul di table1.

Karena DBMS menghasilkan table1 customerIDs dengan penambahan otomatis, jika Anda memasukkan baris, Anda harus mendapatkan nilai itu untuk menyisipkan baris menggunakan customerID itu ke table2.

Saya kira Anda mengatakan "Saya sudah membuat hubungan antara table1 dan table2" yang berarti "Saya menyatakan batasan kunci asing". Dan saya kira Anda berpikir itu berarti "setelah saya memasukkan ke dalam table1 DBMS akan menggunakan nilai kunci yang dibuat secara otomatis sebagai nilai kunci asing ketika saya memasukkan ke dalam table2". Tapi itu tidak berarti itu. Anda harus melakukannya sendiri. Batasan kunci asing hanya berarti bahwa DBMS memeriksa bahwa setiap nilai table2 customerId muncul sebagai nilai table1 customerId.

Anda dapat dan harus menggunakan nilai kunci yang dimasukkan sebelumnya sebagai nilai yang sesuai saat Anda memasukkan ke dalam tabel dengan kunci asing ke kunci tersebut.

Untuk mendapatkan kembali nilai kunci yang ditambahkan secara otomatis yang dihasilkan oleh DBMS gunakan LAST_INSERT_ID() :

INSERT INTO table1 (CustomerName,Address,State)
VALUES('value1','value2','value3');
INSERT INTO table2 (customerId,product,cost)
VALUES(LAST_INSERT_ID(),'valueA','valueB');

Ini adalah untuk apa. Tapi inilah masalahnya jika Anda tidak menggunakannya.

Pertama, jika Anda tidak sedang melakukan transaksi serial maka Anda harus menggunakan LAST_INSERT_ID(). Karena setelah table1 Anda menyisipkan tetapi sebelum Anda memasukkan table2, orang lain dapat menambahkan baris dan/atau menghapus baris termasuk baris baru Anda dan/atau mengubah baris termasuk baris baru Anda. Jadi Anda tidak dapat mengandalkan kueri table1 setelah sisipannya mendapatkan beberapa nilai customerId yang Anda tahu telah Anda tambahkan.

Kedua, misalkan Anda berada dalam transaksi serial dan Anda tidak menggunakan LAST_INSERT_ID().

Jika (NamaPelanggan,Alamat,Negara Bagian) juga merupakan kunci super dari tabel1, yaitu nilainya unik, yaitu SQL UNIQUE/KEY/PK dideklarasikan pada semua atau beberapa kolomnya, kemudian Anda dapat menggunakannya untuk melakukan kueri untuk customerId baru yang terkait:

set @customerId = (
    SELECT customerId
    FROM table1
    WHERE CustomerName = 'value1'
    AND Address = 'value2'
    AND State = 'value3');
INSERT INTO table2 (customerId,product,cost)
VALUES(@customerId,'valueA','valueB');

Tetapi jika (NamaPelanggan,Alamat,Negara Bagian) bukan superkey dari table1 maka Anda tidak dapat melakukan ini. Karena baris lain yang merupakan duplikat untuk subbaris itu bisa ada di tabel1. Jadi Anda bisa mendapatkan beberapa baris kembali. Jadi Anda tidak akan tahu mana yang terbaru. Alih-alih, Anda harus menanyakan table1 sebelum menyisipkan, lalu menyisipkan, lalu menemukan perbedaan antara set customerIds lama dan baru:

CREATE TEMPORARY TABLE table1old (
    customerId (int) PRIMARY KEY
    );
INSERT INTO table1old
SELECT customerId FROM table1;

INSERT INTO table1 (CustomerName,Address,State)
VALUES('value1','value2','value3');

set @customerId = (
    SELECT customerId
    FROM table1
    WHERE CustomerName NOT IN table1old);
INSERT INTO table2 (customerId,product,cost)
VALUES(@customerId,'valueA','valueB');

Cukup gunakan LAST_INSERT_ID().

PS:Menariknya, mengingat definisi tabel, idealnya seseorang dapat menulis:

INSERT INTO (
    SELECT CustomerName,Address,State,A,B
    FROM table1 JOIN table2
    USING (CustomerId))
VALUES('value1','value2','value3','valueA','valueB')

karena hanya ada satu pasang nilai table1 &table2 baru yang dapat dihasilkan. Ada beberapa pembaruan legal melalui tampilan di SQL, meskipun tidak ada yang melibatkan banyak tabel di MySQL saat ini




  1. DBeaver
  2.   
  3. phpMyAdmin
  4.   
  5. Navicat
  6.   
  7. SSMS
  8.   
  9. MySQL Workbench
  10.   
  11. SQLyog
  1. Bagaimana Saya Dapat Menghapus Xampp Secara Permanen di Mac Os?

  2. input mysqli_query melalui variabel

  3. Tidak dapat memulai sesi tanpa kesalahan di phpMyAdmin

  4. Akses ke objek yang diminta hanya tersedia dari jaringan lokal phpmyadmin

  5. Variabel sistem tidak diketahui saat membuka phpmyadmin