我是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)
这两个是依赖于任何现有数据库的两个数据库。 我尝试删除所有其他表,即使我遇到上述错误。
答案 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;