2016-03-29 17 views
1

Oracle sql geliştiricisinde bir veritabanı kurmaya çalışıyorum, bu 3 tablolarım var. Tüm yabancı anahtarlar olan 3 birincil tuşa sahip olması için "GuyAddress" tablosuna ihtiyacım var. Kafamı alamadığım bir hatayı alıyorum.Oracle SQL Veritabanı hatası: "Bu sütun listesi için eşleşen benzersiz veya birincil anahtar yok"

CREATE TABLE Guy 
( 
    id NUMBER(10) PRIMARY KEY, 
    name   VARCHAR(50) 
); 

CREATE TABLE Address 
(
    zipcode   VARCHAR(6), 
    "number"  NUMBER(10), 
    CONSTRAINT PK_Address PRIMARY KEY(zipcode, "number") 
); 

CREATE TABLE GuyAddress 
(
    Guy_id   NUMBER(10), 
    Address_zipcode VARCHAR(6), 
    Address_number NUMBER(10), 
    CONSTRAINT FK_GuyAddress_Guy_id FOREIGN KEY(Guy_id) REFERENCES Guy(id), 
    CONSTRAINT FK_GuyAddress_Address_zipcode FOREIGN KEY(Address_zipcode) REFERENCES Address(zipcode), 
    CONSTRAINT FK_GuyAddress_Address_number FOREIGN KEY(Address_number) REFERENCES Address("number"), 
    CONSTRAINT PK_GuyAddress PRIMARY KEY(Guy_id, Address_zipcode, Address_number) 
); 

Bu hata, ben yapamam çünkü yapılan hatayı tespit edebilirsiniz umarım birileri ...

Error starting at line : 18 in command - 
CREATE TABLE "GuyAddress" 
    (
    Guy_id   NUMBER(10), 
    Address_zipcode VARCHAR(6), 
    Address_number NUMBER(10), 
    CONSTRAINT FK_GuyAddress_Guy_id FOREIGN KEY(Guy_id) REFERENCES Guy(id), 
    CONSTRAINT FK_GuyAddress_Address_zipcode FOREIGN KEY(Address_zipcode) REFERENCES Address(zipcode), 
    CONSTRAINT FK_GuyAddress_Address_number FOREIGN KEY(Address_number) REFERENCES Address("number"), 
    CONSTRAINT PK_GuyAddress PRIMARY KEY(Guy_id, Address_zipcode, Address_number) 
) 
Error report - 
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 

teşekkürler!

+1

'CONSTRAINT PK_Address BİRİNCİL ANAHTAR (zipcode," number ")' bu birleşik birincil anahtardır ve 'CONSTRAINT'ı kullandığınız FK_GuyAddress_Address_zipcode FOREIGN KEY (Address_zipcode) REFERANSLAR Adres (zipcode),', nedeni olabilir. – ELITE

+0

Oracle için (postanızın başlığına ve sorudaki hata mesajına göre) veya MySQL için mi? İkisini de etiketlediniz. – Boneist

+0

Üzgünüz, etiketin "sql" olması gerekiyordu. – SJ19

cevap

2

Sen yapamaz başvurulan tablonun birincil anahtarı her sütun için ayrı yabancı anahtarlarına ihtiyacım - Eğer yabancı bir anahtarda birden sütun olabilir mesela: Ben senin address.number sütunu güncelledik

CREATE TABLE Guy 
( 
    id NUMBER(10) PRIMARY KEY, 
    name   VARCHAR(50) 
); 

CREATE TABLE Address 
(
    zipcode   VARCHAR(6), 
    address_number NUMBER(10), 
    CONSTRAINT PK_Address PRIMARY KEY(zipcode, address_number) 
); 

CREATE TABLE GuyAddress 
(
    Guy_id   NUMBER(10), 
    Address_zipcode VARCHAR(6), 
    Address_number NUMBER(10), 
    CONSTRAINT FK_GuyAddress_Guy_id FOREIGN KEY(Guy_id) REFERENCES Guy(id), 
    CONSTRAINT FK_GuyAddress_Address FOREIGN KEY(Address_zipcode, Address_number) REFERENCES Address(zipcode,address_number), 
    CONSTRAINT PK_GuyAddress PRIMARY KEY(Guy_id, Address_zipcode, Address_number) 
); 

Not Bir anahtar kelimeye dayalı bir sütun kullanmanız önerilmez, çünkü address.address_number olmalıdır. Bunu aşmak için çift tırnak kullanmak (ve aynı zamanda vaka duyarlılığını da zorunlu kılmak) ya tavsiye edilmez; Bu sütuna her başvurduğunuzda bunları kullanmayı hatırlamanız gerekir!

Bir kenara göre, address tablonuzun başka sütunları olduğunu mu sanıyorsunuz? Çünkü işler durduğunda, adres tablosu anlamsızdır ve atlanabilir!

+0

Şimdi bu hatayı alıyorum: Satırda başlayan hata: 18 komutta - Hata raporu - SQL Hatası: ORA-02264: ad zaten mevcut kısıtlama tarafından kullanılıyor 02264. 00000 - "zaten varolan bir kısıtlama tarafından kullanılan ad " * Neden: Belirtilen sınırlama adı benzersiz olmalıdır. * Eylem: Kısıtlama için benzersiz bir kısıtlama adı belirtin. – SJ19

+0

Kısıtlamaları, önceden var olan kısıtlarla aynı ada sahip olmaları için değiştirmeniz gerekir. – Boneist

+0

"DROP TABLE GuyAddress CASCADE CONSTRAINTS;" başlangıçta? – SJ19

İlgili konular