2014-03-30 18 views
0

創建數據庫時,我遇到了問題。每個表都有一個主鍵,同時還有許多外鍵。我的問題是,我不斷收到錯誤創建具有多個主鍵列和引用外鍵的數據庫時出錯

SQL Error: ORA-02270: no matching unique or primary key for this column-list 
02270. 00000 - "no matching unique or primary key for this column-list" 
*Cause: A REFERENCES clause in a CREATE/ALTER TABLE statement 
      gives a column-list for which there is no matching unique or primary 
      key constraint in the referenced table. 
*Action: Find the correct column names using the ALL_CONS_COLUMNS 
      catalog view 

我不知道是什麼原因造成這一點,下垂的PROJECT_RECORDS表的問題。我在PROJECT_TABLES表中使用了相同的方法。

SQL/Oracle的

CREATE TABLE PROJECT_DB 
(DB_ID number (3) NOT NULL primary key, 
DB_NAME varchar2 (25) NOT NULL, 
DB_DESCRIPTION varchar2 (75) NOT NULL, 
DB_DATE date NOT NULL); 

CREATE TABLE PROJECT_DATATYPE 
(DATATYPE_NAME varchar2 (20) NOT NULL PRIMARY KEY, 
DATATYPE_DATATYPE varchar2(50) NOT NULL); 

CREATE TABLE PROJECT_TABLES (
PROJECT_ID number(3) not null references PROJECT_DB(DB_ID) on delete cascade, 
PROJECT_FIELDNAME varchar2(25) not null, 
PROJECT_DATATYPE varchar2(50) not null references PROJECT_DATATYPE(DATATYPE_NAME), 
PROJECT_LENGTH number(3), 
PROJECT_REQUIRED varchar2(8), 
PROJECT_LISTCOLUMNID number (3) not null, 
primary key(PROJECT_ID, PROJECT_LISTCOLUMNID)); 


CREATE TABLE PROJECT_RECORDS (
RECORDS_ROWID number(3) not null, 
RECORDS_LISTCOLUMNID number (3) not null references PROJECT_TABLES(PROJECT_LISTCOLUMNID)on delete cascade, 
RECORDS_LISTID number (3) not null, 
RECORDS_RECORDVALUE varchar2 (25), 
primary key(RECORDS_ROWID, RECORDS_LISTCOLUMNID)); 

commit; 

用於添加多個主鍵的PROJECT_TABLES表的原因是該listcolumnid不是唯一的。

回答

0

如果listcolumnid不是唯一的,你不能把一個外鍵約束就可以了。一個外鍵總是會精確地引用一個父行。所以,你應該在你的外鍵使用兩列(假設真有1:n的關係):

CREATE TABLE PROJECT_RECORDS (
RECORDS_ROWID number(3) not null, 
RECORDS_ID number(3) not null, 
RECORDS_LISTCOLUMNID number (3) not null, 
RECORDS_LISTID number (3) not null, 
RECORDS_RECORDVALUE varchar2 (25), 
primary key(RECORDS_ROWID, RECORDS_LISTCOLUMNID), 
foreign key fk_project_projectrecords (RECORDS_ID, RECORDS_LISTCOLUMNID) references PROJECT_TABLES(PROJECT_ID, PROJECT_LISTCOLUMNID)on delete cascade, 
); 

(這個例子是使用前綴命名約定,我會改變RECORDS_IDPROJECT_ID,同爲RECORDS_LISTCOLUMNID

+0

是的,我修正了(正如我所看到的那樣) – Drunix

0

問題在於你的語法。你不這樣做:

, fieldname datatype references (something) 

你這樣做:

, primary key(somefield) 
, foreign key (somefield) references sometable(somefield)