Klucz obcy równy Null.

0

Witam mam tabelę users:

CREATE  TABLE IF NOT EXISTS `ePrzychodnia`.`users` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `firstName` VARCHAR(45) NOT NULL ,
  `lastName` VARCHAR(45) NOT NULL ,
  `personalId` VARCHAR(11) NOT NULL ,
  `password` VARCHAR(45) NOT NULL ,
  `city` VARCHAR(45) NULL ,
  `address` VARCHAR(45) NULL ,
  `email` VARCHAR(45) NULL ,
  `phone` VARCHAR(45) NULL ,
  `specialization` VARCHAR(45) NULL ,
  `role` VARCHAR(45) NOT NULL ,
  `active` TINYINT(1) NOT NULL ,
  PRIMARY KEY (`id`) ,
  UNIQUE INDEX `personalId_UNIQUE` (`personalId` ASC) ) 

oraz tabelę visits, która zawiera 2 klucze obce do tabeli users:

CREATE  TABLE IF NOT EXISTS `ePrzychodnia`.`visits` (
  `id` INT NULL AUTO_INCREMENT ,
  `doctorId` INT NOT NULL ,
  `patientId` INT NULL,
  `dateVisit` DATE NOT NULL ,
  `hourVisit` DATE NOT NULL ,
  PRIMARY KEY (`id`, `doctorId`, `patientId`) ,
  INDEX `fk_visits_Users1_idx` (`doctorId` ASC) ,
  INDEX `fk_visits_Users2_idx` (`patientId` ASC) ,
  CONSTRAINT `fk_visits_Users1`
    FOREIGN KEY (`doctorId` )
    REFERENCES `ePrzychodnia`.`users` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_visits_Users2`
    FOREIGN KEY (`patientId` )
    REFERENCES `ePrzychodnia`.`users` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION) 

Drugi z kluczy obcych ustawiłem, że może być nullem, ponieważ zależy mi na dodaniu wpisu do tabeli visits gdzie będzie on pusty.
Jednak przy próbie dodania dostaję błąd

Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (eprzychodnia.visits, CONSTRAINT fk_visits_Users2 FOREIGN KEY (patientId) REFERENCES users (id) ON DELETE NO ACTION ON UPDATE NO ACTION)

Co mam zrobić, aby móc nie wypełniać tego klucza w tabeli visits?

0

Obstawiam, że podajesz wartość pustą - '' zamiast braku wartości - Null.

0

Niestety, ale nawet takie coś nie pomaga:

insert into visits(dateVisit, hourVisit, doctorId, patientId) values('2013-06-08', '12:10:00', 6, null);

Dostaję błąd:

Error Code: 1048. Column 'patientId' cannot be null

0

Dowiedziałem się, że jednak klucz obcy, który jest kluczem głównym nie może być nullem. Nie mylę się? W takim razie nic innego mi do głowy nie przychodzi jak:

CREATE  TABLE IF NOT EXISTS `ePrzychodnia`.`visits` (
  `id` INT NULL AUTO_INCREMENT ,
  `doctorId` INT NOT NULL ,
  `patientId` INT NULL,
  `dateVisit` DATE NOT NULL ,
  `hourVisit` DATE NOT NULL ,
  PRIMARY KEY (`id`, `doctorId`, `patientId`))

taka modyfikacja tabeli gdzie doctorId i patientId nie są kluczami obcymi tylko zwykłymi polami. I będę te wartości ustawiał normalnie wg. własnego uznania.

Ta tabela ma reprezentować wizyty. Więc lekarz może dodać wizytę, ale wtedy id pacjenta jest puste, bo nie wiadomo kto się może zapisać na nią. Dopiero gdy pacjent będzie chciał się zapisać na wizytę to ta wartość jest wypełniania. Przy wcześniejszym podejściu nie mogłem ustawić patientId na null, a więc nie miałem możliwości dodania wizyty, na którą można było się zapisać. Czy teraz jeśli nie powiążę tych tabel to takie podejście jest właściwe? Podsumowując wydaje mi się, że na jedno wyjdzie bo jeśli będę chciał wyświetlić wizyty danego pacjenta po prostu użyję zapytanie z odpowiednimi warunkami.

1

Jak ma być coś kluczem obcym, to nie może być kluczem głównym.

doctorId, patientId w tabeli visits to klucze obce, więc nie deklaruj je jako primary key. Te pole mają być primary key w swoich tabelach(zakładam że nazywają się doctors, patients).

Tabela visits ma klucz główny w postaci id. Przeczytaj jak w Twojej bazie danych deklaruje się klucze obce.

1 użytkowników online, w tym zalogowanych: 0, gości: 1