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

Tabela nie pobiera klucza obcego ze zdefiniowanym AUTO_INCREMENT=4

Object Storage Arubacloud
+1 głos
672 wizyt
pytanie zadane 7 grudnia 2017 w SQL, bazy danych przez Samwoja Początkujący (270 p.)
edycja 7 grudnia 2017 przez Samwoja

Posiadam bardzo uproszczona baze e-dziennika o tabelach:

uczen(IDuczen, imie, nazwisko, PESEL, klasa),

ocena (IDocena, (KL,FK) IDprzedmiot, (KL,FK) IDuczen, ocena, dataWystawienia),

przedmiot (IDprzedmiot, przedmiot)

wszystko ładnie działa przy ustawieniach :

CREATE TABLE IF NOT EXISTS `uczen` (
  `IDuczen` int(10) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `imie` text,
  `nazwisko` text,
  `PESEL` text,
  `klasa` text
) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_polish_ci;

problem zaczyna się gdy zmieniam AUTO_INCREMENT=4 :

CREATE TABLE IF NOT EXISTS `uczen` (
  `IDuczen` int(10) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `imie` text,
  `nazwisko` text,
  `PESEL` text,
  `klasa` text
) ENGINE=InnoDB AUTO_INCREMENT=4 ;

po pierwsze - nie mogę stworzyć relacji, 

po drugie - w tabeli "ocena" gdzie jest klucz obcy "IDuczen", nie pobiera mi numeru "IDuczen" takiego jaki jest ustawiony w tabeli "uczen" w kolumnie "IDuczen", czyli ogólnie wygląda to tak : 

IDuczen imie nazwisko PESEL klasa
4        
5        
ocena
IDocena  IDprzedmiot  IDuczen  ocena  dataWystawienia 
1 1 0 5 2017-09-03
2 4 0 4
  2017-09-22

w INSERT INTO pominełam kolumne IDuczen, ponieważ AUTO_INCREMENT (ocena.IDuczen) ma być zmieniany.

Co powinnam zrobić, aby do tabeli "ocena" pobierane były dane z tabeli "uczen" tak, by uwzględniało to również zmianę AUTO_INCREMENT?

chciałabym, żeby było tak : 

IDuczen imie nazwisko PESEL klasa
4        
5        

 

ocena
IDocena  IDprzedmiot  IDuczen  ocena  dataWystawienia 
1 1 4 5 2017-09-03
2 4 5 4
  2017-09-22
komentarz 7 grudnia 2017 przez Tomek Sochacki Ekspert (227,510 p.)
A po co właściwie chcesz robić zmianę auto_increment? Co chcesz osiągnąć, bo wydaje mi się, że od złej strony podchodzisz do swojego problemu. modyfikacje auto_increment to niezbyt dobra praktyka, może rodzić poważne problemy, szczególnie jeśli nie zabezpieczasz się odpowiednio np. foreign key.
komentarz 7 grudnia 2017 przez Samwoja Początkujący (270 p.)
Jeśli nie umiesz mi pomoc to nie pisz zbędnych komentarzy.

Mam taki wymóg, by AUTO_INCREMENT się zmieniało i już. Tak sobie ktoś zażyczył, a ja mam się przystosować.
komentarz 8 grudnia 2017 przez Tomek Sochacki Ekspert (227,510 p.)
ehh czyli rozumiem, że jeśli w aplikacji, która tworzy większy zespół znajdziesz błąd to nic nie powiesz i siedzisz cichutko przy swoim biurku bo to zrobil ktoś inny nie ja i ja się dostosuje... jeśli tak pracujesz to życzę powodzenia i wielkiej kariery... czasami warto na problem spojrzeć z innej strony i nierzadko może okazać sie, że błąd tkwi już w założeniach. Siada się wtedy do stołu i rozmawia chyba że to ja jestem inny bo żyje przekonaniem, że takie podejscie do projektowania aplikacji ma sens... rób jak uważasz tylko nie płacz jak za jakiś czas przez to ingerowanie w auto increment rozwalisz sobie aplikacje... jedyne co można zrobic to oczyścić baze po testach ale i tutaj lepiej po prostu pracowac na kopii a do klienta dac czysta aplikacje. Ja dyskusję kończę, bo widzę że nie rozwazasz nawet analizy założeń projektowych bo przecież skoro tak ktoś wymyślił to znaczy że jest super mega dobrze...
komentarz 8 grudnia 2017 przez Samwoja Początkujący (270 p.)
Nie wiem po co Twoje dziwne komentarze nie związane z tematem. Nie musze chyba tłumaczyć się skad i po co to mam do zrobienia. Liczyłam na pomoc od bardziej doświadczonych kolegów. Nie mieszaj pracy, bo pewnie pracujesz z SQLem, z moim zagadnieniem. Masz cieżki dzień czy miesiac to nie znaczy, że powinieneś się wyżywać na kimś, bo czegoś nie umie bądź nie rozumie.

Jak sam nie wiesz jak to ugryźć, bo jestem pewna, że wytłumaczyłam dobrze co chce osiągnąć to się pytam po raz kolejny ? Po co te komentarze ? Nabijasz sobie punkty ? Chcesz pokazać jaki jesteś zajebisty, bo Ty masz prace z SQLem i innymi programowalnymi rzeczami, a ja się uczę i popełniam błędy ? Współczuję bardziej Twoim współpracownikom, którzy przychodzą po radę, a Ty im każesz "spojrzeć na zagadnienie z innej strony", bo sam nie wiesz ja problem rozwiązać, zamiast przyznać się do tego, że nie jesteś wszechwiedzący.

W sumie jakbyś bardziej uważał co inni mówią (piszą) to byś doczytał, że wyraźnie napisałam, że baza jest bardzo uproszczona i ma 4 tabele ... zastanów się, jaki szanujący się programista stworzyłby coś takiego dla klienta?

Kolejne Twoje komentarze naprawdę są zbędne, bo nic nie wnoszą do postawionego przeze mnie zagadnienia.

1 odpowiedź

0 głosów
odpowiedź 8 grudnia 2017 przez Chess Szeryf (76,710 p.)
edycja 8 grudnia 2017 przez Chess

po drugie - w tabeli "ocena" gdzie jest klucz obcy "IDuczen", nie pobiera mi numeru "IDuczen" takiego jaki jest ustawiony w tabeli "uczen" w kolumnie "IDuczen", czyli ogólnie wygląda to tak : 

Nie wiem, co masz na myśli, ale to są chyba jakieś farmazony za przeproszeniem. Klucz obcy (FOREIGN KEY) nie pobiera automatycznie wartości z kolumny z kluczem podstawowym (PRIMARY KEY) z drugiej tabeli. Nie wprowadzaj innych w błąd.

Od jkavalik z IRC:

it cannot do that automatically because it has no idea what you want to reference, you have to tell it, by putting the value, it will then check if such value exists

https://stackoverflow.com/questions/576441/insert-all-values-of-a-table-into-another-table-in-sql

trigger trig2:

CREATE DEFINER=``@`localhost` trigger trig2 after insert on ocena
for each row set @var = 0

trigger increment_var:

CREATE DEFINER=``@`localhost` trigger increment_var after insert on uczen
for each row
set @var = @var+1
set @var = 0;
CREATE TABLE `uczen` (
  `iduczen` int(11) NOT NULL AUTO_INCREMENT,
  `imie` text,
  `nazwisko` text,
  `pesel` text,
  `klasa` text,
  PRIMARY KEY (`iduczen`)
) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8
CREATE TABLE `ocena` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `idprzedmiot` int(11) DEFAULT NULL,
  `iduczen` int(11) DEFAULT NULL,
  `ocena` int(11) DEFAULT NULL,
  `dataw` date DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `iduczen` (`iduczen`),
  CONSTRAINT `ocena_ibfk_1` FOREIGN KEY (`iduczen`) REFERENCES `uczen` (`iduczen`)
) ENGINE=InnoDB AUTO_INCREMENT=69 DEFAULT CHARSET=utf8
 insert into uczen values(null,'s','sw','w',4);
 insert into uczen values(null,'s','sw','w',1);

-----------------------------------------------------------------------------------------------------------

 set @zmiennax = concat("insert into ocena (id,idprzedmiot,iduczen,ocena,dataw)
 select null,4,uczen.iduczen,5,'2012-02-02'
from uczen order by iduczen desc LIMIT ",@var);

prepare stmtnazwa from @zmiennax;

execute stmtnazwa;

Ten kod omiń.

------------------------------------------------------------------------------------------------------------------

set @zmiennax = concat("insert into ocena (id,idprzedmiot,iduczen,ocena,dataw)
 select null,4,uczen.iduczen,5,'2012-02-02'
from uczen where iduczen>((select max(iduczen) from uczen)-@var)");

prepare stmtnazwa300 from @zmiennax;

execute stmtnazwa300;

Najpierw utwórz dwie tabele. Następnie utwórz zmienną. Później wklej do siebie te dwa triggers.

Kolejny krok, to  dodanie jakiś rekordów do tabeli, np. takich:

insert into uczen values(null,'s','sw','w',1);

A na samym końcu wklej ten kod na końcu, co podałem wyżej (set @zmiennax ...).

Teraz sprawdź, czy odpowiednio zostały skopiowane rekordy z tabeli `uczen` do `ocena`. Po dodaniu rekordów do tabeli uczen, kopiujesz je stamtąd do `ocena` za pomocą tego polecenia:

 execute stmtnazwa300;

https://orkus.wordpress.com/2010/06/29/variable-limit-statement-in-mysql/

komentarz 8 grudnia 2017 przez Samwoja Początkujący (270 p.)
Nie wprowadzam, napisz jak inaczej określić to, że w jednej tabeli pojawiają się dane z innej tabeli, której kolumna się przypisana do tej pierwszej tabeli, skoro nie pobieraniem? Aktualizacja? Ingerencja? podbieranie? zapożyczanie? no nie wiem jak to nazwać.
komentarz 8 grudnia 2017 przez Tomek Sochacki Ekspert (227,510 p.)
Nie mam złego dnia, po prostu wg mnie źle się zabierasz do tego zadania chcąc modyfikować mechanizm auto increment ale oki, skończmy tę dyskusję bo nie o to w tym forum chodzi.

Proponuję, abyś wrzuciła swoje tabele na http://sqlfiddle.com/ i dokładnie napisała jaką tabelę chces uzyskać wynikowo, z jakimi danymi itp. Możesz wrzucić tam też swoje zapytanie i zobaczymy co poprawić. To działa podobnie jak jsfiddle, możesz zapisać wprowadzone dane i je udostępnić. Masz na górze opcję wgrania przykładowej bazy żeby zobaczyć co gdzie się wpisuje.

Tak będzie łatwiej rozmawiać i szukać wspólnie błędu (każdy będzie mógł sobie od razu pisać zapytania, bez konieczności tworzenia tabelek).

Podobne pytania

+1 głos
1 odpowiedź 331 wizyt
pytanie zadane 1 lutego 2022 w SQL, bazy danych przez KonDZIKs Bywalec (2,770 p.)
0 głosów
1 odpowiedź 2,006 wizyt
pytanie zadane 8 sierpnia 2018 w SQL, bazy danych przez Q7V Gaduła (4,250 p.)
0 głosów
2 odpowiedzi 34,463 wizyt
pytanie zadane 26 sierpnia 2017 w SQL, bazy danych przez Radek Begej Użytkownik (580 p.)

92,669 zapytań

141,567 odpowiedzi

320,033 komentarzy

62,034 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

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!

...