Ilişkisel tablo üzerinde INSERT ile daha iyi yolları nelerdir?

2 Cevap php

Benim ilk mysql INSERT testleri yaşıyorum ve ben bu tabloları kullanarak ediyorum:

table employees
-> employee_id
-> employee_name
-> employee_surname
-> employee_url

table areas
-> area_id
-> area_city
-> area_address
-> area_country

table agencies
-> agency_id
-> agency_name
-> agency_url

table node_employees
-> node_id
-> employee_id
-> area_id
-> agency_id

I table_employee veri depolamak, table_areas ve table_agency ama ben aynı anda tüm verileri kaydetmek zorunda değilim, o yüzden sonradan bir çalışanın oluşturup, bir ajans ya da bir adres.

Tekil veri ekin bir durumda, böyle bir şey kullanmak gerekir ya da ben, evet, ben bunu nasıl yapabilirim, node_employees doğrudan tabloyu kullanabilirsiniz etmeliyim?

INSERT INTO employees (employee_name, employee_surname, employee_url)
VALUES ('Roger', 'Waters', 'http://pinkfloyd.com')

INSERT INTO agencies (agency_name, agency_url)
VALUES ('Google', 'http://google.com')

INSERT INTO areas (area_city, area_address, area_country)
VALUES ('Rome', 'Via Roma, 123', 'Italy')

To link rows each other I've created node_employees, a relational table. I use it to link an employee with an area or an agency, so what I should do to link data with this relational table?

SELECT employee_id FROM employees WHERE employee_name = 'Roger'
SELECT agency_id FROM agencies WHERE agency_name = 'Google'

// I'll get their ids in php
$php_employee_id
$php_agency_id

// and then
INSERT INTO node_employees (employee_id, agency_id)
VALUES ('$php_employee_id', '$php_agency_id')

Ben bir alana sahip bir çalışanın bağlantı gerekiyorsa ben ne yapmalıyım, başka bir şüphem var? Ben farklı bir sorgu, bu yüzden her olasılığı için bir sorgu kullanmak etmeliyim?

// so, not this
$php_employee_id = 12;
$php_agency_id = 7;
$php_area_id = null;
INSERT INTO node_employees (employee_id, agency_id, area_id)
VALUES ('$php_employee_id', '$php_agency_id', '$php_area_id') // will this remove the previous data with null in area_id?

2 Cevap

Arasındaki satırları Ben node_employees, ilişkisel bir tablo oluşturduk birbirlerine bağlamak için. Ben bu ilişkisel tablo ile veri bağlantısı için ne yapması gerektiğini bir alan ya da bir ajans ile bir çalışanın bağlamak için kullanabilirsiniz, böylece?

Kurumları çalışanları ilgili, diğeri ve bölgelere çalışanları ilgili için de ayrı bir - iki tablo olmalıdır. Eğer onlar birbirinden bağımsız izlenimi veren, alanlarda ajansları ile ilgili şey söz konusu değil ...

Ne olursa olsun, node_employees.employee_id çalışanın zaten sisteminde geçerli değer olarak bulunması gerekir sağlamak üzere, EMPLOYEES.employee_id yabancı anahtar olmalıdır. Benzer şekilde, agency_id node_employees ile agencies tabloları için.

Çünkü bu ilişkilerin, değerleri EMPLOYEES içinde bulunması gerekir ve AGENCIES tabloları before da NODE_EMPLOYEES tabloda bulunmaktadır. Yani diğer iki tablo ile bir "çocuk" ilişkisi NODE_EMPLOYEES tablo yapar, böylece üç INSERT deyimleri çocuktan önce anne eklemek zorunda ve çocuk anne değerleri kullanmak istiyorsunuz.

Ben ajansları varsayarak yaşıyorum ve alanları çok ilişkileri için vardır. diğer bir deyişle, her çalışanın birden fazla kurum ve alanlara atanabilir. Eğer değilse o zaman ben sadece çalışanların masaya agency_id ve area_id alanlarını eklersiniz ve hatta node_employees tablo oluşturmak değil.

Akılda yukarıdaki ile ...

Verdiğiniz tariften ajansları görünür ve alanları relativally statik. Çalışan veri girilmeden önce Yani onlar kurmak gerekir.

Sonra sadece oluşturduğunuz kaydın id dönmek için çalışan kullanım mysql_insert_id () takarken. (Ben employee_id bir otomatik artış alan olduğunu varsayarak yaşıyorum)

Dediğin gibi sonra yapın

SELECT agency_id FROM agencies WHERE agency_name = 'Google'

// I'll get their ids in php
$php_employee_id <== from mysql_insert_id() after inserting employee record
$php_agency_id <== from above agency Select

// and then
INSERT INTO node_employees (employee_id, agency_id)
VALUES ('$php_employee_id', '$php_agency_id')

son sorgu için

INSERT deyimi varolan kaydı yerini alacak yeni bir kayıt ekler. Mevcut kayıt 'gibi employee_id' olarak benzersiz bir dizin varsa bir hata ile başarısız olur. Bunu VEYA kaydı yoksa kaydını biri varsa veya ınsert'ler günceller DEĞİŞTİR deyimi yapmak için UPDATE kullanmanız gerekir. benzersiz endeksleri üzerinden çalışır çünkü bunu okumak emin olun.

DC