首先,让我以我是一个非常糟糕的数据建模者来开始这个问题。我知道的只够危险的。
我正在构建的表有四个外键,其中两个引用同一个表。这是该表的create语句。
CREATE TABLE IF NOT EXISTS `abnr`.`reputation_event_log` (
`id` INT NOT NULL AUTO_INCREMENT ,
`reputation_event_id` INT NULL ,
`giver_user_id` INT NULL ,
`receiver_user_id` INT NULL ,
`review_id` INT NULL ,
`giver_point_value` SMALLINT NULL DEFAULT 0 ,
`receiver_point_value` SMALLINT NULL DEFAULT 0 ,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
PRIMARY KEY (`id`) ,
INDEX `fk_reputation_log_user` (`giver_user_id` ASC) ,
INDEX `fk_reputation_log_user1` (`receiver_user_id` ASC) ,
INDEX `fk_reputation_log_review` (`review_id` ASC) ,
INDEX `fk_reputation_log_reputation_event` (`reputation_event_id` ASC) ,
CONSTRAINT `fk_reputation_log_user`
FOREIGN KEY (`giver_user_id` )
REFERENCES `abnr`.`user` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_reputation_log_user1`
FOREIGN KEY (`receiver_user_id` )
REFERENCES `abnr`.`user` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_reputation_log_review`
FOREIGN KEY (`review_id` )
REFERENCES `abnr`.`review` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_reputation_log_reputation_event`
FOREIGN KEY (`reputation_event_id` )
REFERENCES `abnr`.`reputation_event` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;
我关心的这篇文章的索引是
fk_reputation_log_user
和fk_reputation_log_user1
。每个声誉事件都有一个给予者,但只有一些有一个接受者。我希望这个FK可以为空,但我不知道怎么做,或者如果它是“允许的”。我还考虑过将所有FK列作为主键的一部分,以对重复的日志条目提供数据库级别的保护,但这不起作用,因为PK列必须不为空。
如果你需要更多的细节,请在评论中说明。谢谢!
(是的,这是为了一个声誉系统,与现有的声誉系统没有太大的不同)
最佳答案
CREATE TABLE IF NOT EXISTS `abnr`.`reputation_event_log` (
`id` INT NOT NULL AUTO_INCREMENT ,
`reputation_event_id` INT NULL ,
`giver_user_id` INT NOT NULL , -- mandatory giver_user_id
`receiver_user_id` INT NULL , -- optional receiver_user_id
. . .
是的,可以将
NULL
放在声明了外键约束的列中。列上的NOT NULL
约束独立于该列上的任何外键约束。外键意味着,如果列具有非空值,则该值必须存在于由外键约束引用的表的主键中。
编辑:至于您的
UNIQUE
需求,您是否知道可以对可空列声明UNIQUE
约束。该列可能包含NULL
s(与主键约束不同)。这是标准的SQL行为,由MySQL支持。 . . .
PRIMARY KEY (`id`),
CONSTRAINT UNIQUE (`giver_user_id`, `receiver_user_id`,
`review_id`, `reputation_event_id`),
. . .
关于mysql - 具有可空FK的MySQL复合PK,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/334830/