我有一张桌子" DEPARTMENT
"它有多个位置。我为地点创建了另一张桌子" DEPARTMENT_LOCATIONS
"。
请注意" Dnumber
"是DEPARTMENT
的主键,我想在" DEPARTMENT_LOCATIONS
"内使用相同的密钥。
我的代码是对还是错?以及如何解决它?
create table if not exists DEPARTMENT(
Dname varchar(100) not null,
Dnumber int unsigned not null,
primary key (Dnumber)
);
create table if not exists DEPARTMENT_LOCATIONS(
Location nvarchar(1000) not null default'',
Dnumber int unsigned not null references DEPARTMENT(Dnumber) on delete cascade,
primary key (Dnumber)
);
答案 0 :(得分:1)
根据您的说法,部门可以有多个地点。如果您尝试将dnumber设置为两个部门和位置的主键,则位置本身与部门之间存在1对1的关系,而不是您想要的1对1 - 因为主键必须是唯一的。
您仍然可以将DNumber作为您的FK引用,但您需要一个单独的主键。要么是唯一的int(类似于你为部门做的事情),要么是Dnumber和位置之间的复合键。我个人并不是复合键的粉丝,所以我通常只会在这个例子中做一个自动增量号。
这样的事情:
create table if not exists DEPARTMENT(
Dname varchar(100) not null,
Dnumber int unsigned not null,
primary key (Dnumber)
);
create table if not exists DEPARTMENT_LOCATIONS(
Location nvarchar(1000) not null default'',
Dnumber int unsigned not null,
myKey int unsigned not null,
primary key (myKey),
foreign key(Dnumber) references DEPARTMENT (Dnumber) on delete cascade
);
请注意,我不熟悉mysql以了解身份列的语法,因为我是MS SQL人员,但上述答案的概念应该仍然适用。
答案 1 :(得分:0)
列Dnumber
必须具有相同的数据类型。
create table if not exists DEPARTMENT_LOCATIONS(
Location nvarchar(1000) not null default'',
Dnumber int unsigned not null,
primary key (Dnumber),
foreign key(Dnumber) references DEPARTMENT (Dnumber) on delete cascade
);