2014-10-29 65 views
0

我有一個表「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) 
); 
+2

Mysql有nvarchar?兩個dnumbers都不應該有unsigned。 – Mihai 2014-10-29 16:25:35

+0

我應該使用int還是nvarchar? – 2014-10-29 16:40:06

+0

我以爲使用無符號是隻有正數 – 2014-10-29 16:48:15

回答

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 
); 

http://sqlfiddle.com/#!2/af4c0

1

從你說什麼,一個部門可以有多個位置。如果您試圖將您的dnumber設置爲這兩個部門和地點的主鍵,則位置本質上與部門具有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的傢伙,雖然上述回答的概念還是應該保持真實。