Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klucze obce wraz z niewymaganą wartością
Forum PHP.pl > Forum > Bazy danych > MySQL
Crea17
Witam.

Chciałbym dowiedzieć się jednej rzeczy.

Mam 2 tabele w relacji (tabela 1) 1:n (tabela 2). Jednak w tabeli 2 nie zawsze będę wpis z id z tabeli 1.
W MySQL Workbench ustawiłem takie pole z możliwością NULL, lecz po wrzuceniu do MySQL znika ta opcja.

INSERT w HeidiSQL wykonuje się poprawnie, lecz z poziomu PHP to samo zapytanie wyrzuca błąd związany z foreign key (Cannot add or update a child row: a foreign key constraint fails).

Wyrzucenie indeksu KEY, a pozostawienie klucza oraz indeksu PRIMARY załatwiło sprawę, ale czy takie rozwiązanie nie spowolni wyszukiwania?
Jeżeli spowolni to jakie można zastosować alternatywne rozwiązanie?

Z góry dziękuję za odpowiedzi,
nospor
Pokaz jak wyglada zapytanie generujace tabelę.
Pokaz jak wygląda zapytanie robiące INSERT - te ktore rzuca błędem
Crea17
Hmm pod ręką akurat mam te same tabele w relacji 1:1 i zapytanie insert do Users. Ogólnie zastanawiam się czy opłaca się robić relacje Users.default_company <-> Companies.id.
W Companies Users_id to właściciel firmy, a Coordinator_id to koordynator firmy, który nie zawsze jest dodawany. Tak samo Users.default_id nie zawsze jest uzupełnione.

Companies:
  1. CREATE TABLE IF NOT EXISTS `mydb`.`Companies` (
  2. `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `name` VARCHAR(255) NOT NULL COMMENT 'Nazwa firmy',
  4. `address` VARCHAR(255) NOT NULL COMMENT 'Ulica numer',
  5. `city` VARCHAR(45) NOT NULL COMMENT 'miasto',
  6. `post_code` VARCHAR(10) NOT NULL COMMENT 'kod pocztowy',
  7. `www` VARCHAR(255) NULL,
  8. `description` TEXT NULL COMMENT 'opis',
  9. `logo` VARCHAR(255) NOT NULL,
  10. `Users_id` INT UNSIGNED NOT NULL,
  11. `Coordinator_id` INT UNSIGNED NULL,
  12. PRIMARY KEY (`id`, `Users_id`, `Coordinator_id`),
  13. INDEX `fk_Companies_Users1_idx` (`Users_id` ASC),
  14. INDEX `fk_Companies_Users2_idx` (`Coordinator_id` ASC),
  15. CONSTRAINT `fk_Companies_Users1`
  16. FOREIGN KEY (`Users_id`)
  17. REFERENCES `mydb`.`Users` (`id`)
  18. ON DELETE NO ACTION
  19. ON UPDATE NO ACTION,
  20. CONSTRAINT `fk_Companies_Users2`
  21. FOREIGN KEY (`Coordinator_id`)
  22. REFERENCES `mydb`.`Users` (`id`)
  23. ON DELETE NO ACTION
  24. ON UPDATE NO ACTION)
  25. ENGINE = InnoDB


Users
  1. CREATE TABLE IF NOT EXISTS `mydb`.`Users` (
  2. `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `email` VARCHAR(255) NOT NULL,
  4. `password` VARCHAR(255) NOT NULL,
  5. `name` VARCHAR(255) NOT NULL,
  6. `surname` VARCHAR(255) NOT NULL,
  7. `phone` VARCHAR(255) NULL,
  8. `default_comapny` INT UNSIGNED NULL,
  9. PRIMARY KEY (`id`, `default_comapny`),
  10. UNIQUE INDEX `id_UNIQUE` (`id` ASC),
  11. INDEX `fk_Users_Companies1_idx` (`default_comapny` ASC),
  12. CONSTRAINT `fk_Users_Companies1`
  13. FOREIGN KEY (`default_comapny`)
  14. REFERENCES `mydb`.`Companies` (`id`)
  15. ON DELETE NO ACTION
  16. ON UPDATE NO ACTION)
  17. ENGINE = InnoDB


Insert

  1. INSERT INTO `Users` (`email`, `name`, `password`, `surname`) VALUES ('michalina.witkowska@yahoo.com','Mateusz','a3084dcff39b508cbeda33749f53f6a7','Lewandowska')
nospor
powinienes ustawic domyslną wartosc na null
default NULL
skoro nie wpisujesz z palca w zapytaniu wartosci kluczy
Crea17
Dzięki za odpowiedź. Sprawdzę jutro jak to działa u mnie.
nospor
Tak z ciekawosci: znasz jakis inny typ niz varchar(255) ?
Crea17
Tak znam, ale to na szybko było tworzone smile.gif

Dopiero teraz miałem możliwość sprawdzenia tego i nie działa ;/

  1. -- -----------------------------------------------------
  2. -- Table `mydb`.`Users`
  3. -- -----------------------------------------------------
  4. CREATE TABLE IF NOT EXISTS `mydb`.`Users` (
  5. `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  6. `email` VARCHAR(255) NOT NULL,
  7. `password` VARCHAR(255) NOT NULL,
  8. `name` VARCHAR(255) NOT NULL,
  9. `surname` VARCHAR(255) NOT NULL,
  10. `phone` VARCHAR(255) NULL,
  11. `default_comapny` INT UNSIGNED NULL DEFAULT NULL,
  12. `Groups_id` INT UNSIGNED NOT NULL,
  13. PRIMARY KEY (`id`, `default_comapny`, `Groups_id`),
  14. UNIQUE INDEX `id_UNIQUE` (`id` ASC),
  15. INDEX `fk_Users_Companies1_idx` (`default_comapny` ASC),
  16. INDEX `fk_Users_Groups1_idx` (`Groups_id` ASC),
  17. CONSTRAINT `fk_Users_Companies1`
  18. FOREIGN KEY (`default_comapny`)
  19. REFERENCES `mydb`.`Companies` (`id`)
  20. ON DELETE NO ACTION
  21. ON UPDATE NO ACTION,
  22. CONSTRAINT `fk_Users_Groups1`
  23. FOREIGN KEY (`Groups_id`)
  24. REFERENCES `mydb`.`Groups` (`id`)
  25. ON DELETE NO ACTION
  26. ON UPDATE NO ACTION)
  27. ENGINE = InnoDB;


Insert:

  1. Error Number: 1452
  2.  
  3. Cannot ADD OR UPDATE a child row: a FOREIGN KEY constraint fails (`mydb`.`Users`, CONSTRAINT `fk_Users_Companies1` FOREIGN KEY (`default_comapny`) REFERENCES `Companies` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION)
  4.  
  5. INSERT INTO `Users` (`email`, `name`, `password`, `surname`) VALUES ([zmoderowane])



Hmmm, albo się tego nie da zrobić bez usuwania indeksów, albo robię coś nie tak ;/ W HeidiSQL wygląda to tak http://scr.hu/1m7p/fihpm
nospor
Przeciez Groups_id nie ustawiles domyslnie na null.....
zas w tym swoim heidi to w ogole nic nie jest ustawione domyslnie na null :/

Cytat
Tak znam, ale to na szybko było tworzone
A czym w szybkosci przeszkadza napisac
char(40) zamiast varchar(255)
albo
varchar (16) zamiast varchar(255)
?
Na szybkosc napisania nie ma to zadnego wplywu....
maly_swd
Te maile z przykładu to są fejki? Plizz napisz, że tak.

Crea17
Oczywiście że fejki.

no_spor właśnie o to chodzi, że w Heidi pokazuje że nie mam możliwości NULL stąd moje wątpliwości czy tak się da.
Co do Groups_id to faktycznie nie ustawiłem (zapomniałem), ale nie tu pokazało błąd, tylko przy default_company
nospor
Nie chce mi sie wierzyc by w tym programie nie mozna bylo tak zrobic.
Ale po to wlasnie piszesz CREATE recznie by bym uniezaleznionym od programow
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.