外键等于空

时间:2013-06-09 10:37:05

标签: mysql database key

我有表格用户:

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) ) 

和表格访问。 Tabel访问有两个用户表的外键

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) 

我设置的第二个外键可以为null,因为我关心在表访问中添加一个条目,它将为空。 但是,当您尝试添加时,我会收到错误

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)

如何使密钥可以为空?

4 个答案:

答案 0 :(得分:0)

在您的关系设置中,更改更新和删除操作

答案 1 :(得分:0)

问题不在于您的外键,而是您的主键。主键中不能包含可空字段。 id字段本身可能是更好的选择。

我不是可空外键的粉丝。我会在用户表中添加一条等同于“非实际人”的记录,并将其用作默认值。顺便说一下,hourvisit字段可能是多余的。

答案 2 :(得分:0)

Dana Bruck我不知道我是否理解你的建议。但在我看来,它是这样的:

表格访问

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`))

没有外键的表。这些字段与表用户无关,但我在需要时设置了这些字段,此字段可能为空。

答案 3 :(得分:-1)

如果访问中的id是auto_increment,为什么要用3列创建PK? 只是id就足够了。您可以为医生和耐心ID创建唯一索引。

试试这个型号:

CREATE  TABLE IF NOT EXISTS `ePrzychodnia`.`visits` (
`id` INT NOT NULL AUTO_INCREMENT ,
`doctorId` INT NOT NULL ,
`patientId` INT NULL,
`dateVisit` DATE NOT NULL ,
`hourVisit` DATE NOT NULL ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `unique_doctor_pacient` (`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)