• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed SQL INSERT tych samych wartości do dwóch różnych tabel

VPS Starter Arubacloud
0 głosów
1,303 wizyt
pytanie zadane 28 stycznia 2018 w SQL, bazy danych przez hiper007 Stary wyjadacz (11,270 p.)
zamknięte 28 stycznia 2018 przez hiper007
Witam!

 

Mam pytanko ;) Czy można włożyć do dwóch różnych tabel te same wartości za pomocą jednego Inserta??
komentarz zamknięcia: Problem rozwiazany

4 odpowiedzi

+1 głos
odpowiedź 28 stycznia 2018 przez Tomasz90 Nałogowiec (25,140 p.)
wybrane 28 stycznia 2018 przez hiper007
 
Najlepsza
Musialbyś mieć triggera. który przy insercie do tej tabeli wrzuca do drugiej. Ogólnie głupie to nie jest bo możesz mieć tabelki z danymi historycznymi i wtedy potrzebujesz taką zapasową na wszelki wypadek, gdy z głównej coś zniknęło. Tyle, że wtedy pasuje wrzucać też nazwę operacji (INSERT, UPDATE, DELETE) i timestamp
komentarz 28 stycznia 2018 przez Tomek Sochacki Ekspert (227,510 p.)
a w czym to rozwiązanie jest lepsze od zrobienia dla tych danych wspólnych osobnej tabeli i po prostu w zapytaniach zrobienia odpowiednich złączeń, i w razie czego blokady na brak możliwości usunięcia danych, które są "gdzieś" używane, czyli w innej tabeli jest do nich odniesienie?

Jeśli z jakiś względów potem nadal będzie potrzeba dwóch oddzielnych tabel to ja dalej upierałbym się aby "core" zrobić w oddzielnych tabelach i nie powielać takich samych danych w kilku tabelach, a w razie faktycznie potrzeby to po prostu zrobić sobie widoki i w nich w selecie joiny itp. Sam dużo korzystam z widoków i wielu tabel, które po prostu łączę w widoku i potem mam w aplikacji proste selecty, już bez żadnych join itp. bo to załatwia za mnie baza jakby "w tle", a ja pobieram zawsze dane z widoków.
komentarz 28 stycznia 2018 przez hiper007 Stary wyjadacz (11,270 p.)

Chodzi mi o konktetna sprawe. 

Do jednej dodaje:

Awizacje:

Id_aw (klucz podst) , data_aw, godz_aw, status, login.

Awizacje_mod: wszystkie modyfikacje zrobione na awizacji edycja usuniecie didanie zmiana statusu.

Id_mod (klucz podst), id_aw (klucz obcy), status, czynnosc.

Najpierw dodaje awizacje do tabeli Awizacje - ogolna tabela oraz odrazu po tym chce dodac do tabeli Awizacje_mod ​​​​​. Ogolnie eszystko jest ok dodaje za pomoca dwoch Insertow :) tylko podczas dodania do pierwszej tabeli tworzy sie klucz podstawowy (id_aw) i dodajac do drugiej tabeli modyfulikacyjnej nie dodaje mi sie klucz obcy w tej tabeli (id_aw), ktory tworzy sie dopiero podczas dodawania do pierwszej tabeli a potrzebuje go tez dodac do drugiej tabeli :) i tu jest problem :) 

 

 

komentarz 28 stycznia 2018 przez Tomasz90 Nałogowiec (25,140 p.)
Jeżeli dobrze zrozumiałem co Tomek napisał to:

Mi nie chodzi tutaj o taką normalną redundancję w stylu mam tabele car1 i car2 i wrzucam wszystko do obu. Miałem na myśli, że jest jedna tabela car do trzymania aktualnych danych, a druga car_history, w której masz wszystkie rewizje dla każdego wiersza z tabeli car. Normalny audyt bazy danch. Na takiej zasadzie działa też moduł do Hibernate'a Envers.

To rozwiązanie z joinami, jak dla mnie ma taką wadę, że robi się joiny. Bo spoko, że się operuje na widokach ale i tak pod spodem te złączenia są wykonywane i wydajność zapytania w dół leci (no chyba, że to widoki zmaterializowane to wtedy nie przeszkadza). Co do tego usuwania to ja potrzebuje coś usunąć z tabeli car i mieć ciągle informacje w tabeli car_history o tym że taki rekord istniał, jakie operacje na nim zostały wykonane i kiedy został usunięty.

Co do tego co hiper007 pyta:

To ja widziałem, że w tej tabeli z modyfikacjami nie były wrzucane, żadne klucze obce itd. Tylko po prostu car_history(car_history_id, timestamp, action, wszystkie kolumny z tabeli car)
komentarz 28 stycznia 2018 przez hiper007 Stary wyjadacz (11,270 p.)

Zobrazuje to kodem :)

											$id=$wiersz['id'];	
											$awizacja=$_POST['awizacja'];
											$data_awizacja=$_POST['data_awizacja'];
											$godz_awiz=$_POST['godz_awiz'];
											$godz_pod=$_POST['godz_pod'];
											$zamowienie=$_POST['zamowienie'];
											$nazwa=$_POST['nazwa'];																					
											$kanal=$_POST['kanal'];
											$spedycja=$_POST['spedycja'];
											$linii=$_POST['linii'];
											$palety=$_POST['palety'];
											$kartony=$_POST['kartony'];
											$rampa=$_POST['rampa'];
											$komentarz=$_POST['komentarz'];
											$artykul=$_POST['artykul'];
											$il_zamowien=$_POST['il_zamowien'];
											$nr_naczepy=$_POST['nr_naczepy'];
											$tel_kierowcy=$_POST['tel_kierowcy'];
											$status='Brak';
											$color='lightblue';
											$kod='Komorniki';
											$login=$_SESSION['login'];
											$data_mod=date("H:i:s d-m-Y");
											$zadanie='Addition';
				
		//Udana walidacja? Załóżmy, że tak!
		
		
		
		
		
		
				if($result = mysql_query("INSERT INTO appt_mod VALUES(NULL,'$id','$awizacja','$data_awizacja','$godz_awiz','$godz_pod','$zamowienie','$nazwa','$kanal','$spedycja','$linii','$palety','$kartony','$rampa','$komentarz','$artykul','$il_zamowien','$nr_naczepy','$tel_kierowcy','$status','$kod','$login','$data_mod','$zadanie')", $polaczenie))	
				{	
										
									
			if($result = mysql_query("INSERT INTO appt VALUES(NULL, '$awizacja','$data_awizacja','$godz_awiz','$godz_pod','$zamowienie','$nazwa','$kanal','$spedycja','$linii','$palety','$kartony','$rampa','$komentarz','$artykul','$il_zamowien','$nr_naczepy','$tel_kierowcy','$status','$color','$kod')", $polaczenie))
							{								
									
									$_SESSION['success']="Awizacja <span style='color:red;'>$awizacja</span> została dodana!";
									require_once "header.php";
									exit();

									
							}else
							{
							
								echo "Błąd bazy danych, nie można wykonać zapytania do bazy\n";
								echo 'Błąd MySQL: ' . mysql_error();
								exit;

							}
							
					}else
					{
							
						echo "Błąd bazy danych, nie można wykonać zapytania do bazy\n";
						echo 'Błąd MySQL: ' . mysql_error();
						exit;

					}

Jedna tabela APPT. Przy dodawaniu do pierwszej tabeli APPT tworzy się klucz podstawowy id_awizacja. Teraz dodając do drugiej tabeli APPT_MOD tworzy się klucz podst. id_mod i do tej drugiej tabeli muszę dodać klucz podstawowych z pierwszej id_awizacja. Jak to zrobić ;)

1
komentarz 28 stycznia 2018 przez Tomek Sochacki Ekspert (227,510 p.)
Nie wiem czy do końca dobrze rozumiem problem, ale może tak:

1 - dodajesz rekord do APPT (swoją drogą rozważ czy na pewno są to dobre nazwy dla tabel...)

2 - pobierasz wprowadzone id, np. w MySQL jest do tego LAST_INSERT_ID()

3 - dodajesz do APPT_MOD nowy rekord wstawiając w id_awizacja pobrane przed chwilą last id.

Ewentualnie druga możliwość to np. wywołanie z PHP procedury na bazie i w niej ogarnięie tych insertów. Można też pomyśleć o transakcji ale to już wszystko zależy od ilości danych, częstotliwości insertów itd.
0 głosów
odpowiedź 28 stycznia 2018 przez Kube Obywatel (1,180 p.)
Według mojej wiedzy nie ma takiej możliwości. Pytanie po co Ci takie "usprawnienie"?
0 głosów
odpowiedź 28 stycznia 2018 przez kosaa Stary wyjadacz (14,130 p.)
robisz dwa zapytania, na pewno na tym zyska czytelnosc kodu gdy bedziesz delegowac poszczegolne linie do konkretnych zadan
0 głosów
odpowiedź 28 stycznia 2018 przez Tomek Sochacki Ekspert (227,510 p.)

Dwie ważne kwestie:

  1. w jednym insercie możesz dać tylko rekordy do jednej tabeli, dla której wywołujesz polecenie insert, ale pomijając ten fakt to w ogóle próby dodawania w jednym insert kilku rekordów jest niedobrym pomysłem, nawet gdybyś dodawał np. 3 rekordy do tej samej tabeli. W takim wypadku jeśli za chwilę będziesz potrzebował np. pobrać last_insert_id to dostaniesz id pierwszego z tych 3 wprowadzonych elementów, co prawdopodobnie spowoduje błąd logiczny w aplikacji (jeśli do czegoś będziesz to id wykorzystywał). Najbezpieczniej więc wywoływać inserty na zasadzie jeden insert = jeden wprowadzony rekord. Co więcej, łatwiej takim kodem zarządzać. Oczywiście nie wchodzimy tu w zagadnienia transakcji czy np. bardziej rozbudowanych procedur na bazie danych, bo to jest zupełnie osobna bajka.
  2. Pytanie zasadnicze, dlaczego masz w bazie danych dwie tabele, które zawierają te same dane? Jest to błąd w strukturze bazy. Zrób trzecią tabelę, gdzie wpisujesz te "dane wspolne", przy czym każdy z tych rekordów niech ma swoje id. Następnie odnoś się do tego ID (proste złączenia tabel) w relacji wiele-do-wielu lub innej w zależności jakie to dane. I voila, wprowadzasz JEDEN rekord do tabeli "dane wspolne" i potem po jednym rekordzie do tabela 1 i tabela 2 albo po prostu tabelę łączącą itp. Daje Ci to też większe bezpieczeństwo, można pozakładać np. constrainy na tabele, aby uniknąć takiej sytuacji: do tabel 1 wprowadziłem dane xxx, do tabeli 2 też dodałem xxx. Potem z jakiś powodów w tabeli 1 zmieniłem xxx na yyy, ale zapomniałem zmienić tego w tabeli 2... i robi się problem, który nie koniecznie od razu wyjdzie w testach...

Podobne pytania

0 głosów
1 odpowiedź 1,721 wizyt
0 głosów
1 odpowiedź 2,640 wizyt
pytanie zadane 4 września 2016 w SQL, bazy danych przez hiper007 Stary wyjadacz (11,270 p.)
+1 głos
1 odpowiedź 1,051 wizyt
pytanie zadane 6 października 2017 w PHP przez moofi Początkujący (470 p.)

92,452 zapytań

141,262 odpowiedzi

319,080 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...