1

我有表用户:

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

和餐桌访问。表访问对用户表有两个外键

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) 

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

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

4 回答 4

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

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

于 2013-06-09T12:52:42.757 回答
0

问题不是你的外键,而是你的主键。主键中不能有可为空的字段。id 字段本身可能是更好的选择。

我不喜欢可为空的外键。我会在您的用户表中添加一条记录,该记录等同于“不是真实的人”并将其用作默认值。顺便说一句,hourvisit 字段可能是多余的。

于 2013-06-09T11:29:38.667 回答
0

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

于 2013-06-09T10:45:58.783 回答
-1

如果访问中的 id 是 auto_increment,为什么要使用 3 列创建 PK?只要身份证就够了。您可以为医生和患者 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) 
于 2013-06-09T11:43:37.850 回答