复合外键约束

sha*_*nuo 1 mysql

复合外键索引不能像我想象的那样工作.在以下示例中,我只想在子表中允许10种组合.但即使父表中没有匹配的组合,最后一个insert语句也是成功的.有没有其他方法可以实现这种约束?

drop table if exists child;
drop table if exists parent;

CREATE TABLE parent(
`ID` int(11) default NULL,
`name` varchar(100) default NULL,
`city` varchar(100) default NULL,
key (name,city),
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;

insert into parent values (1, 'Amar', 'mumbai');
insert into parent values (2, 'Amar', 'Delhi');
insert into parent values (3, 'Amar', NULL);
insert into parent values (4, 'Akbar', 'mumbai');
insert into parent values (5, 'Akbar', 'Delhi');
insert into parent values (6, 'Akbar', NULL);
insert into parent values (7, 'Anthony', 'mumbai');
insert into parent values (8, 'Anthony', 'Delhi');
insert into parent values (9, 'Anthony', NULL);
insert into parent values (10, NULL, NULL);

insert into child values (2, NULL, 'mumbai');
Run Code Online (Sandbox Code Playgroud)

Mar*_*tos 5

不要在外键列中使用空值; 那种方式导致了黑暗的一面.你应该声明这样的列NOT NULL.