views:

511

answers:

2

I am using NetBeans 6.7 Beta to create entity classes from a MySQL (version '5.0.45-log') database. NetBeans accepts most tables, but rejects certain ones consistently (I can't see a pattern), saying they have "no primary key". All tables are using the InnoDB engine. All tables have primary keys of one or more columns. The MySQL query browser and NetBeans' internal database navigator both agree that all tables do, in fact, have a primary key. What's up?

Here is the script snippet generating the bad tables:

-- -----------------------------------------------------
-- Table `beamline`.`rq_requests`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `beamline`.`rq_requests` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `facility_id` INT NOT NULL ,
  `schedule_id` INT NOT NULL ,
  `experiment_id` INT NOT NULL ,
  `person_id` INT NOT NULL ,
  `shift_per_block` INT NOT NULL ,
  `block_count` INT NOT NULL ,
  `other_requirment` VARCHAR(1023) NULL ,
  `submitted` BOOLEAN NOT NULL ,
  `date_modified` DATETIME NOT NULL ,
  `date_created` DATETIME NOT NULL ,
  PRIMARY KEY (`id`) ,
  INDEX `fk_rq_requests_xa_facilities` (`facility_id` ASC) ,
  INDEX `fk_rq_requests_xa_schedules` (`schedule_id` ASC) ,
  INDEX `fk_rq_requests_eec_exp_toc` (`experiment_id` ASC)
# ,INDEX `fk_rq_requests_eec_members` (`person_id` ASC)
 ,CONSTRAINT `fk_rq_requests_xa_facilities`
    FOREIGN KEY (`facility_id` )
    REFERENCES `beamline`.`xa_facilities` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
 ,CONSTRAINT `fk_rq_requests_xa_schedules`
    FOREIGN KEY (`schedule_id` )
    REFERENCES `beamline`.`xa_schedules` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
 ,CONSTRAINT `fk_rq_requests_eec_exp_toc`
    FOREIGN KEY (`experiment_id` )
    REFERENCES `beamline`.`eec_exp_toc` (`exp_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
# ,CONSTRAINT `fk_rq_requests_eec_members`
#    FOREIGN KEY (`person_id` )
#    REFERENCES `beamline`.`rq_questions` (`admin_uid` )
#    ON DELETE NO ACTION
#   ON UPDATE NO ACTION
)
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `beamline`.`rq_questions_facilities`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `beamline`.`rq_questions_facilities` (
  `facility_id` INT NOT NULL ,
  `question_id` INT NOT NULL ,
  PRIMARY KEY (`facility_id`, `question_id`) ,
  INDEX `fk_req_faciliy_current_question_req_question` (`question_id` ASC) ,
  INDEX `fk_rq_questions_facilities_xa_facilities` (`facility_id` ASC),
  CONSTRAINT `fk_req_faciliy_current_question_req_question`
    FOREIGN KEY (`question_id` )
    REFERENCES `beamline`.`rq_questions` (`id` )
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `fk_rq_questions_facilities_xa_facilities`
    FOREIGN KEY (`facility_id` )
    REFERENCES `beamline`.`xa_facilities` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
 )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `beamline`.`rq_questions_supressed`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `beamline`.`rq_questions_suppressed` (
  `facility_id` INT NOT NULL ,
  `question_id` INT NOT NULL ,
  PRIMARY KEY (`facility_id`, `question_id`) ,
  INDEX `fk_req_facility_suppressed_question_req_question` (`question_id` ASC) ,
  INDEX `fk_rq_questions_suppressed_xa_facilities` (`facility_id` ASC),
  CONSTRAINT `fk_req_facility_suppressed_question_req_question`
    FOREIGN KEY (`question_id` )
    REFERENCES `beamline`.`rq_questions` (`id` )
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `fk_rq_questions_suppressed_xa_facilities`
    FOREIGN KEY (`facility_id` )
    REFERENCES `beamline`.`xa_facilities` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

What gives? Thanks in advance.

A: 

Problem solved; the foreign key to xa_facilities was an INT(11), while xa_facilities' primary key was an INT(4). Duh!

Nick
A: 

I've tried running your queries (NB6.5.1) any they seem to be working fine. I did have to comment out all the foreign key constraints, so it's not an exact reproduction.

Given that, could it be possible that you didn't create all the referenced tables (xa_facilities, rq_questions etc)? Are they properly structured?

I recommend, for the future, to separate relational constraints into separate scripts so that you're always sure you're creating them after all your tables are there.

dr Hannibal Lecter