单个父表中的两个FOREIGN键约束在MySQL中不起作用

时间:2014-11-29 12:10:37

标签: mysql mysqli mysql-workbench

我是MySQL新手。我正在努力创建两个表,其中包含来自单父表的两个外键约束。

这两个父子表有什么问题?

我在数据库中只有这两个表(我删除了所有其他表):

-- -----------------------------------------------------
-- Table `db_test`.`tbl_test_monitoring_type`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `db_test`.`tbl_test_monitoring_type` (
  `id` SMALLINT NOT NULL AUTO_INCREMENT COMMENT 'Synthetic ID for an Order Status.',
  `monitoring_type` VARCHAR(1) NOT NULL,
  `message_type` VARCHAR(1) NOT NULL,
  `description` VARCHAR(255) NOT NULL,
  `creared_by` VARCHAR(10) NULL COMMENT 'staff PK number',
  `modified_by` VARCHAR(10) NULL COMMENT 'staff PK number',
  PRIMARY KEY (`id`),
  UNIQUE INDEX `ukidx_monitoring_type` (`monitoring_type` ASC, `message_type` ASC))
ENGINE = InnoDB
COMMENT = 'Lookup table for storing monitorying types.';

-- -----------------------------------------------------
-- Table `db_test`.`tbl_test_monitoring`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `db_test`.`tbl_test_monitoring` (
  `id` SMALLINT NOT NULL AUTO_INCREMENT COMMENT 'Synthetic ID for an Order Status.',
  `monitoring_type` VARCHAR(1) NOT NULL,
  `message_type` VARCHAR(1) NOT NULL,
  `date` TIMESTAMP NOT NULL COMMENT 'Date of monitoring recorded.',
  `message` VARCHAR(500) NULL COMMENT 'More information attached by the user.' ,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `ukidx_monitoring_type_message_type` (`monitoring_type` ASC, `message_type` ASC),
  CONSTRAINT `fk_test_message_type_monitoring`
    FOREIGN KEY (`message_type`)
    REFERENCES `db_test`.`tbl_test_monitoring_type` (`message_type`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB
COMMENT = 'Table to store complete information about monitoring';

我在第二个外键constaraint中遇到问题。即。如果我添加第二个外来然后表tbl_test_monitoring没有创建。第二个约束

CONSTRAINT `fk_test_message_type_monitoring`
    FOREIGN KEY (`message_type`)
    REFERENCES `db_test`.`tbl_test_monitoring_type` (`message_type`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)

这两个是依赖于任何现有数据库的两个数据库。 我尝试删除所有其他表,即使我遇到上述错误。

2 个答案:

答案 0 :(得分:1)

引用的列需要编入索引。试试这样:

CREATE TABLE IF NOT EXISTS `tbl_test_monitoring_type` (
  `id` SMALLINT NOT NULL AUTO_INCREMENT COMMENT 'Synthetic ID for an Order Status.',
  `monitoring_type` VARCHAR(1) NOT NULL,
  `message_type` VARCHAR(1) NOT NULL,
  `description` VARCHAR(255) NOT NULL,
  `creared_by` VARCHAR(10) NULL COMMENT 'staff PK number',
  `modified_by` VARCHAR(10) NULL COMMENT 'staff PK number',
  PRIMARY KEY (`id`),
  INDEX idx_messagetype (message_type),
  UNIQUE INDEX `ukidx_monitoring_type` (`monitoring_type` ASC, `message_type` ASC))
ENGINE = InnoDB
COMMENT = 'Lookup table for storing monitorying types.';

答案 1 :(得分:0)

这解决了我的疑问:

CREATE TABLE parent(
`ID` int(11) default NULL,
`name` varchar(100) default NULL,
`city` varchar(100) default NULL,
key (name,city),
primary key (ID)
) ENGINE=InnoDB;

create table child(
userID int not null,
`name` varchar(100) default NULL,
`city` varchar(100) default NULL,
key (name,city),
FOREIGN KEY (name,city) REFERENCES parent(name,city),
primary key (userID)
) ENGINE=InnoDB;